我只发现调用.toString()
的时间是通过字符串连接和字符串插值进行的:
// Inside of Node:
> let arr = [1,3,5];
> arr.toString()
'1,3,5'
> "" + arr
'1,3,5'
> arr + ""
'1,3,5'
> `${arr}`
'1,3,5'
[应该是console.log
打印出对象的字符串表示形式,并且应该使用toString()
,但是我不确定通常是否没有正确实现toString()
,所以console.log
做其他事情:
> console.log(arr);
[ 1, 3, 5 ]
> console.log("arr is %s", arr);
arr is [ 1, 3, 5 ]
因此在JavaScript本身中,何时调用toString()
?
我认为通过多态性,我们自己编写的任何东西,我们都可以使用ourObj.toString()
将对象的字符串表示形式表示为字符串。但我想知道JavaScript本身(所有功能,库,类)在什么时候真正调用toString()
?
在EcmaScript语言规范的多个部分中,提到了toString
。一个重要的用途发生在抽象操作OrdinaryToPrimitive中:此函数将查找对象的toString
或valueOf
方法并执行它。优先级可以受hint参数的影响。
反过来,OrdinaryToPrimitive
由抽象操作ToPrimitive
调用
ToPrimitive
由ToPrimitive
,ToNumber
,ToString
调用,关系比较,相等比较,表达式求值,ToPropertyKey
构造函数,几种字符串化方法,例如Date
等。
实际上,该语言充满了将要执行toJSON
的内部操作。该规范有200多个参考ToPrimitive
。