符号:隐式字符串转换在 JavaScript 中是如何工作的?
Posted
技术标签:
【中文标题】符号:隐式字符串转换在 JavaScript 中是如何工作的?【英文标题】:Symbols: How does implicit string conversion work in JavaScript? 【发布时间】:2016-04-25 04:19:01 【问题描述】:阅读了关于 Symbol
s 的 javascript 文档,并在一些环境(Chrome、Firefox、Node.js)中进行了测试,我意识到我对隐式字符串转换的理解是有缺陷的。
我一直觉得对象的toString()
方法在尝试转换为字符串时被调用了,如果该函数没有返回原语,那么它会调用对象的toPrimitive()
方法,如果那样的话没用它会输入错误。但是,这个解释并没有涵盖Symbol
s 抛出的TypeError
:
var sym = Symbol("test");
try
console.log(sym + "ing");
catch (error)
console.error(error);
TypeError: Cannot convert a Symbol value to a string
但很明显Symbol
s 有一个有效的toString()
方法。那为什么不叫呢?
【问题讨论】:
【参考方案1】:您是对的,在进行隐式字符串转换时会调用对象 toString
方法。但是,as the spec states,符号上的隐式字符串转换会导致 TypeError
。
作为Dr. Axel Rauschmayer put it:
鉴于字符串和符号都可以是属性键,您希望防止人们意外地将符号转换为字符串。
【讨论】:
这并没有真正回答我的问题:Symbol
s 如何实现类型错误的功能并绕过隐式类型转换的默认工作流程?
@PatrickRoberts 简单的答案是“因为规范是这样说的”。真正的答案是引擎实现者必须遵循规范,以便他们在内部实现一些东西,检查 Symbol
是否参与字符串类型转换,然后抛出异常。 Symbol
本身不处理这种行为。
所以它输入错误的原因不是由于可以从 JavaScript 访问的机制?以上是关于符号:隐式字符串转换在 JavaScript 中是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章