javascript - js類型轉換
伊谢尔伦
伊谢尔伦 2017-05-19 10:12:39
0
5
537
function a () {

}
a.toString = function(){
    console.log(1)
}
a.valueOf = function(){
    console.log(2)
}
a + '1' //2

為什麼只會輸出2,不應該是1和2都會輸出嗎?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(5)
我想大声告诉你

我說的具體一點吧: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的解析機制的問題

PHPzhong

因為你這個是js的解析機制,你用了「+」就表示了使用隱式轉換的問題,如果你沒有特殊規定,js會自動呼叫toString的方法如轉換。如果你寫了valueOf 就會依照valueOf去轉換,當然toString的優先權要高

左手右手慢动作

你做加法運算的時候,只會呼叫valueOf, 因為並沒有印出來,所以不需要轉換成字串,當然不會觸發toString了。
如果你是這樣印出來,就能看到兩個方法都會被呼叫:

console.log(a + '1');
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板