function a () { } a.toString = function(){ console.log(1) } a.valueOf = function(){ console.log(2) } a + '1' //2
为什么只会输出2,不应该是1和2都会输出吗?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
我说的具体一点吧:valueOf和toString方法两个方法一般只能调用一个,根据对象类型的不同,有不同的判断顺序。具体来说:1.如果对象要转换成字符串,会先检测对象是否具有toString()方法,有这调用并返回原始值,再将这个值转换成字符串。如果对象没有toString()方法,或者这个方法不返回一个原始值。那么js会检测该对象是否具有valueOf()方法,如果存在则调用,同样调用并返回原始值,再将这个值转换成字符串。如果对象valueOf和toString两个方法都不存在,那么会抛出一个类型错误异常。2.如果对象要转换成数字,那么会检测是否具有valueOf()方法,如果没有再检测toString()方法,具体原理与上面相同。3.对于所有非日期对象来说,对象到原始值的转换基本上是对象到数字的转换,所有都是优先调用valueof().如果是日期对象,则使用对象到字符串的转换模式。具体到你这道题,a不是日期对象,优先调用valueof()方法,成功转换后自然不会再调用toString()方法了。
运行a+'1'的时候,只调用了a.valueOf方法,并没有调用到toString方法.可以先去了解下toValueOf和toString方法的机制
JS的解析机制的问题
因为你这个是js的解析机制,你用了“+”就表示了使用隐式转换的问题,如果你没有特殊规定,js会自动调用toString的方法如转换。如果你写了valueOf 就会按照valueOf去转换,当然toString的优先级要高
你做加法运算的时候,只会调用valueOf, 因为并没有打印出来,所以不需要转换成字符串,当然不会触发toString了。如果你是这样打印出来,就能看到两个方法都会被调用:
console.log(a + '1');
我说的具体一点吧:valueOf和toString方法两个方法一般只能调用一个,根据对象类型的不同,有不同的判断顺序。具体来说:
1.如果对象要转换成字符串,会先检测对象是否具有toString()方法,有这调用并返回原始值,再将这个值转换成字符串。如果对象没有toString()方法,或者这个方法不返回一个原始值。那么js会检测该对象是否具有valueOf()方法,如果存在则调用,同样调用并返回原始值,再将这个值转换成字符串。如果对象valueOf和toString两个方法都不存在,那么会抛出一个类型错误异常。
2.如果对象要转换成数字,那么会检测是否具有valueOf()方法,如果没有再检测toString()方法,具体原理与上面相同。
3.对于所有非日期对象来说,对象到原始值的转换基本上是对象到数字的转换,所有都是优先调用valueof().如果是日期对象,则使用对象到字符串的转换模式。
具体到你这道题,a不是日期对象,优先调用valueof()方法,成功转换后自然不会再调用toString()方法了。
运行a+'1'的时候,只调用了a.valueOf方法,并没有调用到toString方法.可以先去了解下toValueOf和toString方法的机制
JS的解析机制的问题
因为你这个是js的解析机制,你用了“+”就表示了使用隐式转换的问题,如果你没有特殊规定,js会自动调用toString的方法如转换。如果你写了valueOf 就会按照valueOf去转换,当然toString的优先级要高
你做加法运算的时候,只会调用valueOf, 因为并没有打印出来,所以不需要转换成字符串,当然不会触发toString了。
如果你是这样打印出来,就能看到两个方法都会被调用: