为什么隐式符号到字符串转换';导致JavaScript中的类型错误?
ES6中的为什么隐式符号到字符串转换';导致JavaScript中的类型错误?,javascript,ecmascript-6,symbols,Javascript,Ecmascript 6,Symbols,ES6中的Symbol上有一个.toString(),它返回Symbol的字符串表示形式,但是想知道为什么''+Symbol()不起作用(运行此表达式会抛出类型错误,我不希望如此)?后者只是在一个新的符号上调用.toString(),并将其附加(+)到空字符串吗?来自 符号对象覆盖对象的toString方法; 它不继承Object.prototype.toString()。对于符号对象, toString方法返回对象的字符串表示形式 后者只是在新的符号上调用.toString(),并将其附加到空
Symbol
上有一个.toString()
,它返回Symbol
的字符串表示形式,但是想知道为什么''+Symbol()
不起作用(运行此表达式会抛出类型错误,我不希望如此)?后者只是在一个新的符号上调用.toString()
,并将其附加(+
)到空字符串吗?来自
符号对象覆盖对象的toString方法;
它不继承Object.prototype.toString()。对于符号对象,
toString方法返回对象的字符串表示形式
后者只是在新的符号上调用.toString()
,并将其附加到空字符串中吗
不,实际上,符号不能隐式转换为字符串或数字,尽管有趣的是,您可以将它们隐式转换为布尔值
关于其中一些陷阱:
符号类型转换
使用符号的类型转换时需要注意的一些事项
- 尝试将符号转换为数字时,将抛出
TypeError
(例如+sym
或sym | 0
)
- 使用松散相等时,
Object(sym)==sym
返回true。
Symbol(“foo”)+“bar”
抛出一个TypeError
(无法将符号转换为字符串)。例如,这可以防止您通过符号以静默方式创建新的字符串属性名称
- “safe”
String(sym)
转换的工作原理类似于调用带有符号的Symbol.prototype.toString()
,但请注意新字符串(sym)
将抛出
此行为记录在规范中的以下文件中:
参数类型:符号
结果:抛出一个TypeError
异常
同样,对于:
参数类型:符号
结果:抛出一个TypeError
异常
若要将符号
强制转换为没有类型错误的字符串
,您必须使用toString
方法,或string()
@Dai'+123
作为隐式类型转换,但为什么'+Symbol()
甚至被视为隐式转换都不起作用?对不起,我误解了您的问题。你到底看到了什么行为?您是否收到了类型错误
或其他问题?@Dai,很抱歉这个问题造成了混乱。稍微修改一下。我看到''+Symbol()
抛出TypeError,想知道为什么它会这样做,因为Symbol().toString()
有效。当我尝试Symbol()。\uuuuu proto\uuuuuuuu.toString()时,它抛出了一个错误,也许它可以帮助理解这一点。。。(我不知道答案。)相关:隐式将对象强制转换为字符串是否意味着对对象调用object.prototype.toString()
?@Thomson是的,将对象隐式转换为字符串将调用toString
方法,无论是对实例本身(如果已设置)还是从原型调用。如您所述,隐式转换Symbol
到String
应该会成功,因为Symbol
实例(Symbol()
)上有一个可行的toString()
)?@Thomson-Symbol实际上不是对象的,而是原语,它们被明确设计为抛出TypeError
,而不是隐式调用toString
方法。@AlexanderO'Mara,他在问当您执行symbol.toString()时是否会发生意外装箱?还是应该使用字符串(符号)来防止装箱?这并不能回答问题,这就是为什么''+symbol
不起作用的原因。