对象的隐含强制

时间:2013-06-16 12:29:32

标签: javascript

我在使用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。

我错过了什么?感谢。

2 个答案:

答案 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]

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