3

我在使用 JavaScript 中的 + 运算符进行隐式强制时遇到问题。即valueOf和toString的优先顺序。

var obj = {};

obj.toString();=>“[对象对象]”

obj.valueOf();=> 对象 {}

'Hello ' + obj;=>“你好[对象对象]”

所以 obj 使用 toString() 方法而不是 valueOf() 被隐式强制转换为字符串;

var obj2 = {
    toString: function() {
        return "[object MyObject]"; 
    },
    valueOf: function() { 
        return 17;
    }
};

obj2.toString();=>“[对象我的对象]”

obj2.valueOf();=> 17

'Hello ' + obj2;=> “你好 17”

所以当我重写 toString 和 valueOf 方法时,+ 运算符将强制使用 valueOf。

我错过了什么?谢谢。

4

2 回答 2

5

答案可以在类似的线程中找到:valueOf() vs. toString() in Javascript

如果对象可以转换为“原始”,JavaScript 将尝试将其视为数字。toString否则使用通过该方法的字符串连接。没有该valueOf方法,JavaScript 无法告诉如何转换数据,因此对象将被连接为字符串。

如果您有兴趣,可以在第 58 页左右的以下 pdf 中找到准确的规范:http ://www.webreference.com/javascript/reference/ECMA-262/E262-3.pdf

希望有所帮助:-)

于 2013-06-16T12:55:31.240 回答
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]

所以基本上这取决于你使用这个对象的方式。

于 2013-06-16T13:06:39.820 回答