84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
function a () { } a.toString = function(){ console.log(1) } a.valueOf = function(){ console.log(2) } a + '1' //2
Warum wird nur 2 ausgegeben? Sollten nicht sowohl 1 als auch 2 ausgegeben werden?
小伙看你根骨奇佳,潜力无限,来学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了。
如果你是这样打印出来,就能看到两个方法都会被调用: