所以我正在读一本Js的书,遇到了对象到原始转换这个美丽的话题。 作者在书中说
由于历史原因,如果 toString 或 valueOf 返回一个对象,则没有错误,但会忽略此类值(例如,如果该方法不存在(。这是因为在古代,JavaScript 中没有好的"错误"概念。
现在我尝试了这个,但没有像书中所说的那样:
let user = {
name: "John",
money: 1000,
toString(){
return {
name: 'Bong'
};
}
};
alert(user);
我在控制台中收到错误,说:
未捕获的类型错误:无法将对象转换为基元值
但是,如果我这样做
alert(user.toString());
然后没有 erro,它给出 [对象对象]
请解释这种行为。
在第一种情况下,隐式调用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
如果内部对象具有返回对象的toString
,则第二种情况也不起作用:
let user = {
name: "John",
money: 1000,
toString() {
return {
name: 'Bong',
toString() { // toString of the inner object is overridden
return {}; // ... and it returns an object
}
};
}
};
alert(user.toString()); // now even the second case won't work because when toString of the inner object is called, a string is expected, but instead an object is returned which is a no no
[object Object]
是对象的默认字符串表示形式。
调用对象时; 在对象上调用toString()
,初始实现返回[object Object]
。
如果要查看对象,可以通过console.log
或通过JSON.stringify()
进行查看。您还可以遍历所有属性并单独检查它们。
示例:
const objectOne = {};
const objectTwo = new Object;
const objectThree = {};
objectThree.toString = function () { return "Bong" };
alert(objectOne); // [object Object]
alert(objectTwo); // [object Object]
alert(objectThree); // Bong
alert
不会自动将非原语转换为字符串,您需要toString()
方法。当你在非原语上调用toString()
时,你会得到默认的返回,这是它的类型,由于javascript中的所有内容本质上都是一个对象,所以默认返回是[Object object]
。