1. 程式人生 > >關於JS型別轉換的筆記

關於JS型別轉換的筆記

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的類似,只不過是方法的優先順序變換了,跟規則是吻合的。