在标准JavaScript ES6环境中,何时调用过.toString()?
我只发现调用在标准JavaScript ES6环境中,何时调用过.toString()?,javascript,ecmascript-6,tostring,Javascript,Ecmascript 6,Tostring,我只发现调用.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(),但我不确定它是否通常未正确实现,因此conso
.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()
,但我不确定它是否通常未正确实现,因此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
。抽象操作中有一个重要用途:此函数将查找对象的toString
或valueOf
方法,并执行它。优先级可能受提示参数的影响
依次,抽象操作调用OrdinaryToPrimitive
ToPrimitive
由ToNumber
、ToString
、ToPropertyKey
、关系比较、等式比较、表达式求值、Date
构造函数、几种字符串化方法(如toJSON
)调用
事实上,该语言充满了内部操作,这些操作将执行ToPrimitive
。本规范对ToString
有200多个引用
例子
下面是一个带有toString
方法实现的对象,以证明toString
是在内部调用的
然后遵循几个表达式,每个表达式都会触发toString
//准备
设obj={
toString(){
this.i=(this.i | | 0)+1;//计数器
log(“call#”+this.i);
返回“0”;
}
};
//触发器通过多个构造触发字符串
({})[obj];
1 设置超时(obj);//不是标准的EcmaScript环境,而是在代理中定义的。
在EcmaScript语言规范的几个部分中,提到了toString
。抽象操作中有一个重要用途:此函数将查找对象的toString
或valueOf
方法,并执行它。优先级可能受提示参数的影响
依次,抽象操作调用OrdinaryToPrimitive
ToPrimitive
由ToNumber
、ToString
、ToPropertyKey
、关系比较、等式比较、表达式求值、Date
构造函数、几种字符串化方法(如toJSON
)调用
事实上,该语言充满了内部操作,这些操作将执行ToPrimitive
。本规范对ToString
有200多个引用
例子
下面是一个带有toString
方法实现的对象,以证明toString
是在内部调用的
然后遵循几个表达式,每个表达式都会触发toString
//准备
设obj={
toString(){
this.i=(this.i | | 0)+1;//计数器
log(“call#”+this.i);
返回“0”;
}
};
//触发器通过多个构造触发字符串
({})[obj];
1 设置超时(obj);//不是标准的EcmaScript环境,而是在代理中定义的。
为了说明一些可能更常见的情况:
Array
的join()使用
> let foo = { a: 123, toString: function() { return `an object with value ${this.a}`; } };
> foo
{ a: 123, toString: [Function: toString] }
> foo.toString()
'an object with value 123'
> foo.a = 456;
456
> foo.toString()
'an object with value 456'
> `${foo}`
'an object with value 456'
> "foo: " + foo
'foo: an object with value 456'
> "foo: ".concat(foo)
'foo: an object with value 456'
> let d = {};
> d[foo] = "hello";
'hello'
> d
{ 'an object with value 456': 'hello' }
> Symbol(foo)
Symbol(an object with value 456)
> String(foo)
'an object with value 456'
> let bar = Object.assign({}, foo); // clone
> bar.a = 789;
789
> [foo, bar].join(" - ")
'an object with value 456 - an object with value 789'
为了说明一些可能更常见的情况:
Array
的join()使用
> let foo = { a: 123, toString: function() { return `an object with value ${this.a}`; } };
> foo
{ a: 123, toString: [Function: toString] }
> foo.toString()
'an object with value 123'
> foo.a = 456;
456
> foo.toString()
'an object with value 456'
> `${foo}`
'an object with value 456'
> "foo: " + foo
'foo: an object with value 456'
> "foo: ".concat(foo)
'foo: an object with value 456'
> let d = {};
> d[foo] = "hello";
'hello'
> d
{ 'an object with value 456': 'hello' }
> Symbol(foo)
Symbol(an object with value 456)
> String(foo)
'an object with value 456'
> let bar = Object.assign({}, foo); // clone
> bar.a = 789;
789
> [foo, bar].join(" - ")
'an object with value 456 - an object with value 789'
document.write
对非字符串对象使用toString()
。每当需要字符串且未定义valueOf时,就会调用它。“据推测,console.log
打印出对象的字符串表示形式”-否。您认为它为什么会这样做?您在考虑哪个特定的console
(有许多实现)?document.write
对非字符串对象使用toString()
。每当需要字符串且未定义valueOf时,就会调用它。“假定,console.log
打印出对象的字符串表示。”-不,你认为为什么会这样?您在考虑哪个特定的控制台(有许多实现)?您是否认为您可以给出调用toString()
的几个实际示例?请参阅答案的补充。确实如此。还有很多很多:newfunction(obj)
,~obj
,obj | 0
,“+obj
,…您认为您是否可以给出调用toString()
的几个实际例子?请参阅答案的补充。确实如此。还有很多很多:新功能(obj)
,~obj
,obj | 0
,“+obj
。。。