詳解JavaScript物件轉原始值
阿新 • • 發佈:2021-12-12
目錄
- Object.prototype.valueOf()
- Object.prototype.toString()
- Symbol.toPrimitive
- 物件轉換原始值
- 1. 預期被轉換成字串型別
- 2. 預期被轉換成數字型別
- 3. 預期被轉換成預設型別(其他)
- 三種方法觸發的順序
- 總結
Object.prototype.valueOf()
物件的valueOf旨在返回物件的原始值,會在需要將物件轉換成原始值的地方自動執行。詳細點這裡。
Object.prototype.toString()
toString()方法會返回表示該物件的字串,會在物件預期要被轉換成字串的地方自動執行。物件預設的toString()方法會返回[object type],這個type就是物件建構函式的名稱。詳細點這裡。
Symbol.toPrimitive
Symbol.toPrimitive(hint)
方法作用同valueOf()一樣,但是優先順序要高於valueOf();而且該方法還會接受http://www.cppcns.com一個引數hint,這個引數用來表示期望轉換的原始值的具體型別,有以下幾種:
- number:數字型別
- string:字串型別
- default:預設
let obj = { [Symbol.toPrimitive](hint) { switch (hint) { case 'number': return 123; case 'string': return 'str'; case 'default': return 'default'; rFcyyNCzHdefault: throw new Error(); } } }; 2 * obj // 246 3 + obj // '3default' obj == 'default' // true String(obj) // 'str'
物件轉換原始值
以上三種方法都是在物件被預期轉換成某種原始值時觸發。
1. 預期被轉換成字串型別
對應的hint型別為string
進行輸出的地方,如alert()
String(obj)
let a = { toString () { return '2' } } console.log(String(a)) // 2
字串連線(+)操作
let a = { toString () { return '2' } } console.log(a + 'vv')
模板字串
let a = { [Symbol.toPrimitive] (hint) { console.log(hint) // string return 2 } } console.log(`你是老${a}?`) // 你是老2?
2. 預期被轉換成數字型別
對應的hint型別為numbe
除法:
let a = { valueOf () { return 2 } } console.log(2 / a,a / 2) // 1 1
Number(obj):
let a = { [Symbol.toPrimitive] (hint) { console.log(hint) // number return 2 } } console.log(Number(a)) // 2
正負號(注意不是加減運算):
let a = { [Symbol.toPrimitive] (hint) { console.log(hint) // number return 2 } } console.log(+a) // 2 console.log(-a) // http://www.cppcns.com-2
3. 預期被轉換成預設型別(其他)
對應的hint型別為default
數字加法(即與物件相加的一方為數字型別):
let a = { [Symbol.toPrimitive] (hint) { console.log(hint) // default return 2 } } console.log(1 + a) // 3
這一點有點意外,原以為像這種情況預期轉換的型別應該是數字型別,但事實上卻是default;
布林運算:所有物件都被轉換成true;
let a = { [Symbol.toPrimitive] (hint) { console.log(hint) // 沒有觸發 return false } } console.log(Boolean(a),a && 123) // true 123
布林運算包括==
三種方法觸發的順序
首先判斷物件是否有Symbol.toPrimitive(hint)方法,若有則執行該方法,沒有則執行下面的步驟;
如果預期被轉換成字串型別時,則優先執行toString()方法;
如果預期被轉換成預設型別或者數字型別時,則優先執行valueOf()方法:
注:若沒有valueOf()方法,但是定義了toString()方法,則會執行toString()方法;
總結
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望www.cppcns.com您能夠多多關注我們的更多內容!