摘要:在屬性用作函數(shù)值的幫助下,一個對象可被轉(zhuǎn)換為原始值。該函數(shù)被調(diào)用時,會被傳遞一個字符串參數(shù),表示要轉(zhuǎn)換到的原始值的預(yù)期類型。參數(shù)的取值是和中的任意一個。在其他情況時,所有運算元都會轉(zhuǎn)換為原始數(shù)據(jù)類型的數(shù)字類型值,然后作數(shù)字的相加。
Symbol.toPrimitive 是一個內(nèi)置的 Symbol 值,它是作為對象的函數(shù)值屬性存在的,當(dāng)一個對象轉(zhuǎn)換為對應(yīng)的原始值時,會調(diào)用此函數(shù)。
在 Symbol.toPrimitive 屬性(用作函數(shù)值)的幫助下,一個對象可被轉(zhuǎn)換為原始值。該函數(shù)被調(diào)用時,會被傳遞一個字符串參數(shù) hint ,表示要轉(zhuǎn)換到的原始值的預(yù)期類型。
hint 參數(shù)的取值是 "number"、"string" 和 "default" 中的任意一個。
轉(zhuǎn)換過程如下
number: val → val.valueOf() → val.toString() → error
string: val → val.toString() → val.valueOf() → error
default: 同 number
// 一個沒有提供 Symbol.toPrimitive 屬性的對象,參與運算時的輸出結(jié)果 var obj1 = {}; console.log(+obj1); // NaN console.log(`${obj1}`); // "[object Object]" console.log(obj1 + ""); // "[object Object]" // 接下面聲明一個對象,手動賦予了 Symbol.toPrimitive 屬性,再來查看輸出結(jié)果 var obj2 = { [Symbol.toPrimitive](hint) { if (hint == "number") { return 10; } if (hint == "string") { return "hello"; } return true; } }; console.log(+obj2); // 10 -- hint 參數(shù)值是 "number" console.log(`${obj2}`); // "hello" -- hint 參數(shù)值是 "string" console.log(obj2 + ""); // "true" -- hint 參數(shù)值是 "default"JS 中的加法運算
1、使用 ToPrimitive 運算轉(zhuǎn)換左右運算元為原始數(shù)據(jù)類型(primitive)。
2、在轉(zhuǎn)換后,如果其中一個運算元出現(xiàn)原始數(shù)據(jù)類型是“字符串”類型值時,則另一運算元強制轉(zhuǎn)換為字符串,然后做字符串的連接運算。
3、在其他情況時,所有運算元都會轉(zhuǎn)換為原始數(shù)據(jù)類型的“數(shù)字”類型值,然后作數(shù)字的相加。
然后我們看下 [] + {} == {} + []1、{} + [] == 0
其實{}只是一個代碼塊
{} + [] => + [] => + ([]).valueOf() => + "" => 0
2、[] + {} == "[object Object]"
([]).valueOf() + ({}).valueOf() => [] + {} => ([]).toString() + ({}).toString => "" + "[object Object]" => "[object Object]"
3、[] + {} == {} + []
解析為 "[object Object]" == "[object Object]"
4、{} + [] != [] + {} 注:[chrome 中 {} + [] == [] + {}](https://stackoverflow.com/que...
{} + [] != [] + {} => + [] != [] + {} => 0 != "[object Object]"
參考:
Symbol.toPrimitive
JS 加法運算全解析
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106187.html
摘要:方法和方法介紹方法和我們知道在中,一切皆為對象。每個對象都有一個方法和方法,其中方法返回一個表示該對象的字符串,方法返回該對象的原始值。這兩個方法都是原型鏈上的方法,被每個對象所繼承。 valueOf()方法和toString()方法介紹 valueOf()方法和toString() 我們知道在js中,一切皆為對象。每個對象都有一個toString()方法和value方法,其中toSt...
摘要:我們首先了解一下中有關(guān)類型轉(zhuǎn)換的知識。新增類型拋出異常從列表可以明顯看到少了一個類型轉(zhuǎn)換為的規(guī)則。這里要強調(diào)一點第二個表達式?jīng)]有涉及到強制類型轉(zhuǎn)換。如果文中有錯誤或者有某些強制轉(zhuǎn)換的情形沒有涉及到請及時留言告知,我會修改并補充進去。 javascript是一門非常奇特的語言,它有時候奇特的會讓人懷疑人生。比如讓我們看一下下面的一些奇葩例子: false == 0 ...
摘要:本文將介紹規(guī)范中的抽象操作。它們主要用于規(guī)范的說明,不需要被真正地實現(xiàn)。該抽象操作接受一個參數(shù)和一個可選的參數(shù)。根據(jù)規(guī)范中的加法操作,對于操作,會調(diào)用和把和轉(zhuǎn)化為原始數(shù)據(jù)類型。 本文將介紹ECMAScript7規(guī)范中的ToPrimitive抽象操作。 預(yù)備知識 ECMAScript數(shù)據(jù)類型 ECMAScript數(shù)據(jù)類型細分為兩大類數(shù)據(jù)類型,一種是語言類型,一種是規(guī)范類型: 語言類型...
摘要:我們再來回顧下文首提出的這個比較運算,首先為對象,則調(diào)用函數(shù)將其轉(zhuǎn)化為字符串對于右側(cè)的,首先會進行顯式類型轉(zhuǎn)換,將其轉(zhuǎn)化為。 JavaScript 運算符規(guī)則與隱式類型轉(zhuǎn)換詳解 從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎(chǔ)與工程實踐系列文章,主要探討 JavaScript 中令人迷惑的加減乘除與比較等常見運算中的規(guī)則與隱式類型轉(zhuǎn)換;本文中涉及的參考資料全部聲明在了JavaSc...
摘要:我們再來回顧下文首提出的這個比較運算,首先為對象,則調(diào)用函數(shù)將其轉(zhuǎn)化為字符串對于右側(cè)的,首先會進行顯式類型轉(zhuǎn)換,將其轉(zhuǎn)化為。 JavaScript 運算符規(guī)則與隱式類型轉(zhuǎn)換詳解 從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎(chǔ)與工程實踐系列文章,主要探討 JavaScript 中令人迷惑的加減乘除與比較等常見運算中的規(guī)則與隱式類型轉(zhuǎn)換;本文中涉及的參考資料全部聲明在了JavaSc...
閱讀 2079·2023-04-25 22:58
閱讀 1432·2021-09-22 15:20
閱讀 2709·2019-08-30 15:56
閱讀 2004·2019-08-30 15:54
閱讀 2124·2019-08-29 12:31
閱讀 2743·2019-08-26 13:37
閱讀 608·2019-08-26 13:25
閱讀 2110·2019-08-26 11:58