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]
请解释这种行为。
在第一种情况下,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)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |