成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Symbol.toPrimitive 與 [] + {} == {} + []

raoyi / 2172人閱讀

摘要:在屬性用作函數(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

相關(guān)文章

  • toString方法和valueOf方法以及Symbol.toPrimitive方法的學(xué)習(xí)

    摘要:方法和方法介紹方法和我們知道在中,一切皆為對象。每個對象都有一個方法和方法,其中方法返回一個表示該對象的字符串,方法返回該對象的原始值。這兩個方法都是原型鏈上的方法,被每個對象所繼承。 valueOf()方法和toString()方法介紹 valueOf()方法和toString() 我們知道在js中,一切皆為對象。每個對象都有一個toString()方法和value方法,其中toSt...

    el09xccxy 評論0 收藏0
  • 有關(guān)javascript強制轉(zhuǎn)換不得不說的故事

    摘要:我們首先了解一下中有關(guān)類型轉(zhuǎn)換的知識。新增類型拋出異常從列表可以明顯看到少了一個類型轉(zhuǎn)換為的規(guī)則。這里要強調(diào)一點第二個表達式?jīng)]有涉及到強制類型轉(zhuǎn)換。如果文中有錯誤或者有某些強制轉(zhuǎn)換的情形沒有涉及到請及時留言告知,我會修改并補充進去。 javascript是一門非常奇特的語言,它有時候奇特的會讓人懷疑人生。比如讓我們看一下下面的一些奇葩例子: false == 0 ...

    xcold 評論0 收藏0
  • ECMAScript7規(guī)范中的ToPrimitive抽象操作

    摘要:本文將介紹規(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ī)范類型: 語言類型...

    張漢慶 評論0 收藏0
  • JavaScript 運算符規(guī)則隱式類型轉(zhuǎn)換詳解

    摘要:我們再來回顧下文首提出的這個比較運算,首先為對象,則調(diào)用函數(shù)將其轉(zhuǎn)化為字符串對于右側(cè)的,首先會進行顯式類型轉(zhuǎn)換,將其轉(zhuǎn)化為。 JavaScript 運算符規(guī)則與隱式類型轉(zhuǎn)換詳解 從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎(chǔ)與工程實踐系列文章,主要探討 JavaScript 中令人迷惑的加減乘除與比較等常見運算中的規(guī)則與隱式類型轉(zhuǎn)換;本文中涉及的參考資料全部聲明在了JavaSc...

    snifes 評論0 收藏0
  • JavaScript 運算符規(guī)則隱式類型轉(zhuǎn)換詳解

    摘要:我們再來回顧下文首提出的這個比較運算,首先為對象,則調(diào)用函數(shù)將其轉(zhuǎn)化為字符串對于右側(cè)的,首先會進行顯式類型轉(zhuǎn)換,將其轉(zhuǎn)化為。 JavaScript 運算符規(guī)則與隱式類型轉(zhuǎn)換詳解 從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎(chǔ)與工程實踐系列文章,主要探討 JavaScript 中令人迷惑的加減乘除與比較等常見運算中的規(guī)則與隱式類型轉(zhuǎn)換;本文中涉及的參考資料全部聲明在了JavaSc...

    Kyxy 評論0 收藏0

發(fā)表評論

0條評論

raoyi

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<