3. 類型轉(zhuǎn)換
JS中類型轉(zhuǎn)換只有三種情況,分別是
- 轉(zhuǎn)換為布爾值 【 Boolean()】
- 轉(zhuǎn)換為數(shù)字 【 Number()、parseInt()、parseFalse() 】
- 轉(zhuǎn)換為字符串【 String() 、str.toString() 】
3.1 轉(zhuǎn)Boolean
在條件判斷時,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都轉(zhuǎn)為 true,包括所有對象。
3.2 對象轉(zhuǎn)基本類型
- 對象在轉(zhuǎn)換基本類型時,首先會調(diào)用valueOf 然后調(diào)用toString。并且這兩個方法你是可以重寫的。
- 調(diào)用哪個方法,主要是要看這個對象傾向于轉(zhuǎn)換為什么。如果傾向于轉(zhuǎn)換為 Number 類型的,就優(yōu)先調(diào)用 valueOf;如果傾向于轉(zhuǎn)換為 String 類型,就只調(diào)用 toString
var obj = {
toString () {
console.log('toString')
return 'string'
},
valueOf () {
console.log('valueOf')
return 'value'
}
}
alert(obj) // string
console.log(1 + obj) // 1value
- 如果重寫了 toString 方法,而沒有重寫 valueOf 方法,則會調(diào)用 toString 方法
var obj = {
toString () {
return 'string'
}
}
console.log(1 + obj) // 1string
調(diào)用上述兩個方法的時候,需要 return 原始類型的值 (primitive value),如果在調(diào)用 valueOf 的時候,返回的不是原始類型的值,就會去調(diào)用 toString。
var obj = {
toString () {
console.log('toString')
return 'string'
},
valueOf () {
console.log('valueOf')
return {}
}
}
console.log(1 + obj)
// 依次打印出
valueOf
toString
1string
如果返回還不是原始的值,就會報錯
var obj = {
toString () {
console.log('toString')
return {}
},
valueOf () {
console.log('valueOf')
return {}
}
}
console.log(1 + obj)
// 報錯。無法將一個對象轉(zhuǎn)換為原始類型的值
Uncaught TypeError: Cannot convert object to primitive value
當然你也可以重寫 Symbol.toPrimitive ,該方法在轉(zhuǎn)基本類型時調(diào)用優(yōu)先級最高。
var obj = {
toString () {
console.log('toString')
return {}
},
valueOf () {
console.log('valueOf')
return {}
},
[Symbol.toPrimitive] () {
console.log('primitive')
return 'primi'
}
}
console.log(1 + obj) // 1primi
同樣只能 return 原始類型的值,否則會報和上面所說一樣的錯。