關於JS型別轉換的筆記
阿新 • • 發佈:2018-12-10
javascript是一門弱型別語言,不同的基礎資料之間的運算自己會進行一個相關的型別轉換,如常見的
var t = "test", b = t + 12 //"test12"
這些常見的型別轉換比較熟悉,但是涉及到關於物件與原始值之間的運算,型別轉換規則比較特殊
基礎知識點:
var t = {a: 1, b: 2}
t.toString() //"[object Object]"
t.valueOf() //{a: 1, b: 2}即物件本身
var arr = [1,2,3,4]
arr.toString() //"1,2,3,4"類似arr.join(",")
物件均有toString,valueOf兩個方法
轉換規則:
物件->String
1:如果物件的toString方法存在,那麼呼叫toString,若該物件返回的值為原始值,則將該原始值轉換為字串返回(若該值不為字串的話)2:如果物件的toString方法返回的不是原始值,且valueOf方法存在,呼叫valueOf方法,若該物件返回的值為原始值,則將該原始值轉換為字串返回(若該值不為字串的話)3:若物件的toString與valueOf方法返回的值均不為原始值,那麼Throw TypeError的錯誤。
//規則1 function t(){ return 1 } console.log(t + 3) //"function t(){↵ return 1↵}3" //修改toString方法 t.toString = function(){ return "bbbbbb" } console.log(t + 3) //"bbbbbb3" console.log(t.valueOf()) /* function t(){ return 1 } */ //不為原始值 //再次修改toString方法,使其返回的值不為原始值 t.toString = function(){ return {a:1} } console.log(t + 3) // Uncaught TypeError: Cannot convert object to primitive value //那麼重寫valueOf方法 t.valueOf = function(){ return "dddddd" } console.log(t + 3) //"dddddd3" //這時,再修改toString t.toString = function(){ return "3333dd" } console.log( t + 3 ) //"3333dd3"
物件->number
1:如果物件的valueOf方法存在,那麼呼叫valueOf,若該物件返回的值為原始值,則將該原始值轉換為數字返回(若該值不為數字的話)2:如果物件的valueOf方法返回的不是原始值,且toString方法存在,呼叫toString方法,若該物件返回的值為原始值,則將該原始值轉換為數字返回(若該值不為數字的話)3:若物件的toString與valueOf方法返回的值均不為原始值,那麼Throw TypeError的錯誤。
文獻:javascript權威指南 型別轉換章節
物件到number的具體程式碼跟物件到string的類似,只不過是方法的優先順序變換了,跟規則是吻合的。