对象中的 toString() 方法行为



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

由于历史原因,如果 toString 或 valueOf 返回一个对象,则没有错误,但会忽略此类值(例如,如果该方法不存在(。这是因为在古代,JavaScript 中没有好的"错误"概念。

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

let user = {
name: "John",
money: 1000,
toString(){
return {
name: 'Bong'
};
}
};
alert(user);

我在控制台中收到错误,说:

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

但是,如果我这样做

alert(user.toString()); 

然后没有 erro,它给出 [对象对象]

请解释这种行为。

在第一种情况下,隐式调用user.toStringalert因为需要一个字符串,而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]

最新更新