2016-12-03 178 views
6

ES6中的Symbol上有一个.toString(),它返回Symbol的字符串表示形式,但想知道为什么'' + Symbol()不起作用(运行此表达式会抛出TypeError,我不期望)?后者是否只需在新的Symbol上调用.toString()并附加(+)它为空字符串?将JavaScript符号转换为字符串?

+1

@Dai'''+ 123'作为隐式类型转换,但为什么'''+ Symbol()'即使被认为是隐式转换也不起作用? – Thomson

+0

对不起,我误解了你的问题。你实际上看到了什么行为?你有'TypeError'还是其他的? – Dai

+0

@戴,对不起,这个问题引起了困惑。修改了一下。我看到'''+ Symbol()'抛出了TypeError,并想知道为什么它会这样做,因为Symbol()。toString()'工作。 – Thomson

回答

8

是后者只是一个新的Symbol调用.toString()和append(+)到空字符串?

实际上,符号不能隐式转换为字符串或数字,尽管有趣的是,您可以将它们隐式转换为布尔值。

在一些陷阱MDN actually has a section

符号类型转换

有些事情与符号的类型转换工作时要注意。

  • 当试图一个符号转换为一个数字,一个TypeError将被抛出(例如+symsym | 0)。
  • 当使用松散平等,Object(sym) == sym返回true.
  • Symbol("foo") + "bar"抛出一个TypeError(不能转换符号串)。例如,这可以防止您从符号中静静地创建新的字符串属性名称。
  • “安全”String(sym)转换的工作方式类似于使用符号调用Symbol.prototype.toString(),但请注意new String(sym)会丢失。

此行为规范记录下abstract ToString operation

参数类型:符号

结果:抛出一个TypeError例外。

,类似的还有abstract ToNumber operation

参数类型:符号

结果:抛出一个TypeError例外。

投下Symbol为字符串没有TypeError,你必须使用toString方法,或String()

+1

是否隐式将对象转换为字符串意味着在对象上调用'Object.prototype.toString()'? – Thomson

+0

@Thomson是的,隐式地将一个对象转换为一个字符串会调用'toString'方法,无论是在实例本身(如果有)或者原型中。 –

+0

作为你的评论,因为'Symbol'实例('Symbol()')上有一个可用的'toString()',所以将'Symbol'隐式转换为'String'应该成功? – Thomson