在标准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
    。。。