對象轉(zhuǎn)基本類型
對象在轉(zhuǎn)換基本類型時,會調(diào)用 valueOf 和 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 屬性的話功戚,會優(yōu)先調(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 原始類型的值,否則會報和上面所說一樣的錯啸臀。
var obj = {
toString () {
console.log('toString')
return {}
},
valueOf () {
console.log('valueOf')
return {}
},
[Symbol.toPrimitive] () {
console.log('primitive')
return {}
}
}
console.log(1 + obj)
// 報錯
TypeError: Cannot convert object to primitive value
- 其他問題
var obj = {
toString () {
console.log('toString')
return '1'
},
valueOf () {
console.log('valueOf')
return 2
}
}
console.log(1 + obj)
console.log('1' + obj)
// 依次輸出
valueOf
3
valueOf
12
按理來說
'1' + obj
這個 + 是傾向于轉(zhuǎn)為轉(zhuǎn)換為字符串類型的(也就是調(diào)用 toString)届宠;但是烁落,它最后卻是調(diào)用 valueOf。
原因在于豌注,對于 + 這個操作符來說伤塌,本身就是代表加法,也就是說轧铁,本來就傾向于轉(zhuǎn)為 number 類型每聪,只不過發(fā)現(xiàn)加號左邊出現(xiàn)字符串,于是乎把它的右邊也轉(zhuǎn)為字符串(也就是調(diào)用 valueOf 后齿风,return 的值再轉(zhuǎn)為字符串)