Javascript 对象的隐式强制

Javascript 对象的隐式强制,javascript,Javascript,我在JavaScript中使用+运算符进行隐式强制时遇到问题。即valueOf和toString的优先级顺序 var obj={} obj.toString()=>“[对象]” obj.valueOf()=>对象{} “你好”+obj=>“你好[对象]” 因此,在valueOf()上使用toString()方法将obj隐式强制为字符串 obj2.toString()=>“[对象MyObject]” obj2.valueOf()=>17 “你好”+obj2=>“你好17” 因此,当我重写toStr

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

var obj={}

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

obj.valueOf()=>对象{}

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

因此,在valueOf()上使用toString()方法将obj隐式强制为字符串

obj2.toString()=>“[对象MyObject]”

obj2.valueOf()=>17

“你好”+obj2=>“你好17”

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


我错过了什么?谢谢。

答案可以在类似的帖子中找到:

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

如果您感兴趣,可在第58页的以下pdf中找到精确的规格:


希望帮助:-(P)< P> > P >为了使理解更简单,请考虑以下两种情况:

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]

因此,基本上这取决于您使用此对象的方式。

有趣。。。顺便说一句,如果从obj2中取出valueOf,+运算符将再次强制toString在使用+运算符的对象参数时,valueOf始终优先于toString。结果是obj.valueOf().toString()==“[对象]”;现在这很有意义。我想知道如何才能真正利用Javascript的这一功能。在案例2中,valueOf()首先被调用,然后toString()被调用。valueOf总是被调用当您引用“p”变量时,请尝试这个p===p。valueOf()//返回TrueThePDF是looong。这是个奇怪的问题。我现在明白了,这个想法是给定var num=Object.valueOf();var str=Object.toString();我们应该始终使用num.toString()==str;否则,我们将看到obj2示例的混乱。谢谢
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]