对象中的 toString() 方法行为

The*_*use 3 javascript object javascript-objects

所以我正在阅读一本 Js 的书,并遇到了对象到原始转换这个美丽的话题。作者在书中说

由于历史原因,如果 toString 或 valueOf 返回一个对象,则没有错误,但该值会被忽略(就像该方法不存在一样)。那是因为在古代,JavaScript 中没有好的“错误”概念。

现在我尝试了这个,但没有像书中所说的那样:

let user = {
    name: "John",
    money: 1000,

   toString(){
       return {
           name: 'Bong'
       };
   }
  };

  alert(user);
Run Code Online (Sandbox Code Playgroud)

我在控制台中收到错误消息:

未捕获的类型错误:无法将对象转换为原始值

但是,如果我这样做

alert(user.toString()); 
Run Code Online (Sandbox Code Playgroud)

然后没有错误,它给出了[Object object]

请解释这种行为。

ibr*_*rir 6

在第一种情况下,user.toString被隐式调用,因为alert它需要一个字符串而user不是一个字符串。当user.toString()被调用并且返回值不是字符串时会抛出错误。

在第二种情况下,user.toString由您显式调用,它的名称是否存在无关紧要,toString因为它像任何其他方法一样返回内部对象(此处不需要原始值)。然后将内部对象传递给alert,并toString隐式调用它,它返回一个字符串,因为它没有被覆盖。为清楚起见,第二种情况可以分为两部分:

let obj = user.toString();    // first user.toString gets called, it will return the inner object
alert(obj);                   // obj.toString will implicitly gets called and since that will return a string everthing will be fine
Run Code Online (Sandbox Code Playgroud)

如果内部对象有一个toString返回一个对象,那么第二种情况也不起作用:

let obj = user.toString();    // first user.toString gets called, it will return the inner object
alert(obj);                   // obj.toString will implicitly gets called and since that will return a string everthing will be fine
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你的朋友。现在我懂了。 (2认同)