JavaScript對(duì)象類型轉(zhuǎn)換的分類及步驟詳解
對(duì)象類型轉(zhuǎn)換時(shí)的分類
對(duì)象轉(zhuǎn)換時(shí)先要確定轉(zhuǎn)換的類型,這個(gè)類型在對(duì)象的[Symbol.toPrimitive]
屬性值-函數(shù)的參數(shù)中可以拿到,一共有三種:
- string
- number
- default
string以下兩種情況會(huì)將確定對(duì)象的轉(zhuǎn)換類型為string:
- 使用
alert(person)
- 將對(duì)象看做是一個(gè)對(duì)象的屬性來取值時(shí),例如
family[person]
number以下兩種情況會(huì)將確定對(duì)象的轉(zhuǎn)換類型為number:
- 使用一元數(shù)學(xué)操作符,例如
alert(+person)
- 使用比較運(yùn)算符,例如
alert(person > 1)
default其他情況會(huì)確定對(duì)象的轉(zhuǎn)換類型為default:
- 相加操作,例如
alert(obj + 1)
- 相等比較,例如
alert(obj == 2)
對(duì)象轉(zhuǎn)換時(shí)的步驟
- 先看對(duì)象內(nèi)有沒有
[Symbol.toPrimitive]
屬性 - 如果有,則執(zhí)行該方法
- 如果沒有,則檢查對(duì)象要轉(zhuǎn)換的類型
- 如果是string,執(zhí)行
toString()
或valueOf()
方法,如果其中一種存在的話 - 如果是number,執(zhí)行
valueOf()
或toString()
方法,如果其中一種存在的話 - 如果是default,執(zhí)行
valueOf()
或toString()
方法,如果其中一種存在的話
下面是幾個(gè)例子
有[Symbol.toPrimitive]屬性
let obj = { name: 'jack', money: 1, [Symbol.toPrimitive](hint) { console.log(hint); return hint == 'string' ? this.name : this.money; }, }; let person = { jack: 'property jack', }; // hint equals to string alert(obj); // jack alert(person[obj]) // property jack // hint equals to number alert(+obj); // 1 alert(obj > 0); // true // hint equals to default alert(obj + 50); // 51
- 沒有
[Symbol.toPrimitive]
屬性
let obj = { name: 'jack', money: 1, }; // hint equals to string, excutes the toString() and return [object object] alert(obj); // [object object] // hint equals to number, excutes the valueOf() and return the object itself alert(+obj); // NaN // hint equals to default, excutes the valueof() and return the object itself alert(obj === obj); // true // do the same as (obj.valueOf() === obj);
必須返回一個(gè)基礎(chǔ)類型
無論是調(diào)用哪個(gè)函數(shù),他都必須返回一個(gè)基本數(shù)據(jù)類型,如果返回的不是基本數(shù)據(jù)類型,在嚴(yán)格模式下會(huì)報(bào)錯(cuò)
存在顯示的toString方法
存在顯示聲明的toString()
方法,并且不存在其他類型轉(zhuǎn)換方法,例如valueOf()
或者[Symbol.toPrimitive]
,則無論對(duì)象是按照什么類型轉(zhuǎn)換,都執(zhí)行toString()
方法。(存在顯示的toString,則只找toString,不找valueOf)
// if there exsits a toString(), and no other functions such as valueOf() or [symbol.toPromitive], then all the conversions will excute toString() let obj = { name: 'jack', money: 1, toString() { return this.money; }, }; alert(obj); // 1 alert(+obj); // 1 alert(obj + 9); // 10
先確定對(duì)象是按照什么類型轉(zhuǎn)換,一共有三種類型:
- string
- number
- default
轉(zhuǎn)換規(guī)則:
- 先看對(duì)象內(nèi)有沒有
[Symbol.toPrimitive]
屬性 - 如果有,則執(zhí)行該方法
- 如果沒有,則檢查對(duì)象要轉(zhuǎn)換的類型
- 如果是string,執(zhí)行
toString()
或valueOf()
方法,如果其中一種存在的話 - 如果是number,執(zhí)行
valueOf()
或toString()
方法,如果其中一種存在的話 - 如果是default,執(zhí)行
valueOf()
或toString()
方法,如果其中一種存在的話
翻譯自原文:https://javascript.info/objec...
以上就是JavaScript對(duì)象類型轉(zhuǎn)換的分類及步驟詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript對(duì)象類型轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等屬性學(xué)
這篇文章主要介紹了JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等屬性學(xué)習(xí)筆記,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07BootStrap智能表單實(shí)戰(zhàn)系列(七)驗(yàn)證的支持
這篇文章主要介紹了BootStrap智能表單實(shí)戰(zhàn)系列(七)驗(yàn)證的支持 ,凡是涉及到用戶編輯信息然后保存的頁(yè)面,都涉及到一個(gè)數(shù)據(jù)是否符合要求的檢查,需要客服端和服務(wù)器端的校驗(yàn)的問題,本文介紹非常詳細(xì),具有參考價(jià)值,需要的朋友可以參考下2016-06-06javascript 中事件冒泡和事件捕獲機(jī)制的詳解
這篇文章主要介紹了javascript 中事件冒泡和事件捕獲機(jī)制的詳解的相關(guān)資料,網(wǎng)上的相關(guān)資料有很多,但是講的不是多清楚,通過本文希望能讓大家理解掌握,需要的朋友可以參考下2017-09-09Bootstrap柵格系統(tǒng)使用方法及頁(yè)面調(diào)整變形的解決方法
這篇文章主要介紹了Bootstrap柵格系統(tǒng)使用方法及頁(yè)面調(diào)整變形的解決方法,需要的朋友可以參考下2017-03-03Javascript幻燈片播放功能實(shí)現(xiàn)過程解析
這篇文章主要介紹了Javascript幻燈片播放功能實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05