符号:隐式字符串转换在 JavaScript 中是如何工作的?

Posted

技术标签:

【中文标题】符号:隐式字符串转换在 JavaScript 中是如何工作的?【英文标题】:Symbols: How does implicit string conversion work in 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() 方法。那为什么不叫呢?

【问题讨论】:

【参考方案1】:

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

作为Dr. Axel Rauschmayer put it:

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

【讨论】:

这并没有真正回答我的问题:Symbols 如何实现类型错误的功能并绕过隐式类型转换的默认工作流程? @PatrickRoberts 简单的答案是“因为规范是这样说的”。真正的答案是引擎实现者必须遵循规范,以便他们在内部实现一些东西,检查 Symbol 是否参与字符串类型转换,然后抛出异常。 Symbol 本身不处理这种行为。 所以它输入错误的原因不是由于可以从 JavaScript 访问的机制?

以上是关于符号:隐式字符串转换在 JavaScript 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 隐式类型转换之:加号+

有趣的JavaScript隐式类型转换

javascript教程隐式类型转换如何操作

有趣的JavaScript隐式类型转换

[2016-02-08][javascript][数据类型的隐式转换]

JavaScript:隐式类型转换