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了。
如果你是這樣印出來,就能看到兩個方法都會被呼叫: