【问题标题】:Symbols: How does implicit string conversion work in JavaScript?符号:隐式字符串转换在 JavaScript 中是如何工作的?
【发布时间】:2016-04-25 04:19:01
【问题描述】:

阅读了关于 Symbols 的 JavaScript 文档,并在一些环境(Chrome、Firefox、Node.js)中进行了测试,我意识到我对隐式字符串转换的理解是有缺陷的。

我一直觉得对象的toString()方法在尝试转换为字符串时被调用了,如果该函数没有返回原语,那么它会调用对象的toPrimitive()方法,如果那样的话没用它会输入错误。但是,这个解释并没有涵盖Symbols 抛出的TypeError

var sym = Symbol("test");

try {
  console.log(sym + "ing");
} catch (error) {
  console.error(error);
}
TypeError: Cannot convert a Symbol value to a string

但很明显Symbols 有一个有效的toString() 方法。那为什么不叫呢?

【问题讨论】:

    标签: javascript type-conversion ecmascript-6


    【解决方案1】:

    您是对的,在进行隐式字符串转换时会调用对象 toString 方法。但是,as the spec states,符号上的隐式字符串转换会导致 TypeError

    作为Dr. Axel Rauschmayer put it:

    鉴于字符串和符号都可以是属性键,您希望防止人们意外地将符号转换为字符串。

    【讨论】:

    • 这并没有真正回答我的问题:Symbols 如何实现类型错误的功能并绕过隐式类型转换的默认工作流程?
    • @PatrickRoberts 简单的答案是“因为规范是这样说的”。真正的答案是引擎实现者必须遵循规范,以便他们在内部实现一些东西,检查 Symbol 是否参与字符串类型转换,然后抛出异常。 Symbol 本身不处理这种行为。
    • 所以它输入错误的原因不是由于可以从 JavaScript 访问的机制?
    猜你喜欢
    • 2016-09-27
    • 2017-11-09
    • 2017-04-18
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多