我在使用JavaScript中的+运算符进行隐式强制时遇到了麻烦。即valueOf和toString的优先级顺序。
var obj = {};
obj.toString();
=> “[object Object]”
obj.valueOf();
=>对象{}
'Hello ' + obj;
=> “Hello [object Object]”
因此,对于使用toString()方法而不是valueOf()的obj,obj被隐式强制转换为字符串;
var obj2 = {
toString: function() {
return "[object MyObject]";
},
valueOf: function() {
return 17;
}
};
obj2.toString();
=> “[object MyObject]”
obj2.valueOf();
=> 17
'Hello ' + obj2;
=> “你好17”
因此,当我覆盖toString和valueOf方法时,+运算符将强制使用valueOf。
我错过了什么?感谢。
答案 0 :(得分:5)
答案可以在类似的主题中找到:valueOf() vs. toString() in Javascript
如果对象可以转换为“原始”,JavaScript会尝试将其视为数字。否则使用通过toString
方法的字符串连接。如果没有valueOf
方法,JavaScript无法告诉如何转换数据,因此该对象将作为字符串连接。
如果您对此感兴趣,请参阅以下pdf中的精确规格,请参阅第58页:http://www.webreference.com/javascript/reference/ECMA-262/E262-3.pdf
希望有所帮助: - )
答案 1 :(得分:0)
只是为了让它更容易理解,请考虑以下两种情况 -
var p = {};
//Case 1, here valueOf() method is called.
console.log(p); //Prints: Object {}
//Case 2, toString() method will be called.
console.log('the value of p is'+ p); //Prints: the value of p is[object Object]
所以基本上它取决于你使用这个对象的方式。