国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript "相等" 的二三事

wanghui / 2441人閱讀

摘要:還規(guī)定了無窮及其它的相應(yīng)規(guī)范,有興趣可自行查找相關(guān)資料。其它相同數(shù)值相等。類型中,引用同一對象,相等。不同點對的判斷上各有不同。以為代表的相等和相等以為代表的不相等和相等以為代表的相等和不相等相同類型采用嚴(yán)格比較。

相等不相等?

先來隨便舉幾個?吧~

"0" == true          //?
[1] == [1]           //?
[1] == 1             //?
null == false        //?
null == undefined    //?
NaN === NaN          //?
+0 === -0            //?
Object.is([], [])    //?
Object.is(-0, +0)    //?
Object.is(NaN, NaN)  //?

var arr = [NaN, 0, +0]
arr.indexOf(-0)      //?
arr.indexOf(NaN)     //?
arr.includes(-0)     //?
arr.includes(NaN)    //?

可能 ±0NaN 會糾結(jié)一點,還是比較基礎(chǔ)的,也許很多人一眼掃過去便知道答案了,網(wǎng)上也已經(jīng)有了很多相關(guān)的經(jīng)驗總結(jié)。我在這里結(jié)合官方規(guī)范進行了整理,希望能帶給你不一樣的認識。

預(yù)備知識 ECMAScript Language Types

傳送門。根據(jù)最新規(guī)范,EcmaScript 一共有7種語言類型:

Undefined

Null

Number

String

Boolean

Symbol

Object

我們經(jīng)常把 Object 類型稱為 引用數(shù)據(jù)類型其它5種則為基本數(shù)據(jù)類型。(Symbol怎么說..?

ToNumber

傳送門。任意 EcmaScript 類型轉(zhuǎn)化為 Number 類型

類型 結(jié)果
Undefined NaN
Null +0
Boolean true -> 1,false -> +0
Number 不轉(zhuǎn)變
String 空字符串 -> +0,有效的數(shù)字 -> 十進制數(shù)字,其它 -> NaN
Object 先ToPrimitive(hint Number),再ToNumber
Symbol 拋錯,TypeError 錯誤
ToPrimitive

傳送門。內(nèi)部方法,主要功能是將引用數(shù)據(jù)類型轉(zhuǎn)化為基本數(shù)據(jù)類型

根據(jù)內(nèi)部標(biāo)記 hint 的不同有不同的調(diào)用順序。

hint有三種:defaultnumberstringdefault 默認遵照 number 規(guī)則。

default/number:先 valueOf,后 toString。一般轉(zhuǎn)化規(guī)則皆如此。

string:先 toString,后 valueOf。如Date對象方法、String()轉(zhuǎn)化等。

如果 toString/valueOf 中某一方法返回類型不為對象類型,則直接返回該值,不會繼續(xù)調(diào)用后面方法。如果兩者都返回對象類型,會拋 TypeError 錯誤。

-0、+0、0 的疑惑

明明日常沒什么卵用,為什么會有±0?

其實遵從IEEE754標(biāo)準(zhǔn)的編程語言都有±0的概念,IEEE754標(biāo)準(zhǔn)的64位浮點數(shù),是以1+11+53形式的符號位+階數(shù)位+尾數(shù)位表示。

符號位、階數(shù)位、尾數(shù)位都是0,那便是+0,也就是常規(guī)的數(shù)字0

符號位為1,階數(shù)位、尾數(shù)位都是0,那便是 -0

IEEE754還規(guī)定了NaN無窮及其它的相應(yīng)規(guī)范,有興趣可自行查找相關(guān)資料。

PS

這部分其實是后加的,你會發(fā)現(xiàn)每個知識點都是緊密相連的,構(gòu)成了一個龐大的知識網(wǎng)絡(luò),限于篇幅我不會詳細介紹,但我會盡量貼出規(guī)范出處,大家可自行研究。

SameValueNonNumber 內(nèi)部方法

SameValueNonNumber 方法接收兩個參數(shù) x 和 y ,其中 x 和 y 都不是 Number 類型,該方法返回 truefalse

主要規(guī)則

斷言:x 不是 Number 類型。

斷言:x 和 y 是 相同類型。

如果 x 是 Undefined 類型,返回 true

如果 x 是 Null 類型,返回 true

如果 x 是 String 類型:

如果 x 和 y 長度相同且相應(yīng)編碼單元相同,返回 true

否則返回 false

如果 x 是 Boolean 類型:

如果 x 和 y 都是true 或者 都是false,返回 true

否則返回 false

如果 x 是 Symbol 類型:

如果 x 和 y 都是相同 Symbol 值,返回 true

否則返回 false

如果 x 和 y 指向同一對象,返回 true 。否則返回 false

小結(jié)

相同類型比較規(guī)則(除Number類型)

都是 undefined,相等

都是 null,相等

String 類型中,都是相同字符串,相等

Boolean 類型中,都是 true 或者 都是 false,相等

Symbol 類型中,都是相同 Symbol 值,相等

Object 類型中,引用同一對象,相等

使用

哪些 JavaScript 公開方法采用了 SameValueNonNumber 比較呢?

公開方法木有

接著看下去你就會知道,撇開數(shù)值類型比較,SameValueNonNumberSameValueSameValueZero=== 的公共方法。

SameValueZero 內(nèi)部方法

SameValueZero 方法接收兩個參數(shù) x 和 y ,其中 x 和 y 是 EcmaScript 任意類型值,該方法返回 truefalse

主要規(guī)則

如果 x 和 y 的類型不同,返回 false

如果 x 是 Number 類型:

如果 x 和 y 都是 NaN ,返回 true

如果 x 是 -0 ,y 是 +0 ,返回 true

如果 x 是 +0 ,y 是 -0 ,返回 true

如果 x 和 y 數(shù)值相等,返回 true

返回 false

返回 SameValueNonNumber(x, y) 方法的返回值。

小結(jié)

不同類型不相等

Number 類型中:±0 相等。NaN 和 NaN 相等。其它相同數(shù)值相等

SameValueNonNumber 比較:

都是 undefined,相等

都是 null,相等

String 類型中,都是相同字符串,相等

Boolean 類型中,都是 true 或者 都是 false,相等

Symbol 類型中,都是相同 Symbol 值,相等

Object 類型中,引用同一對象,相等

使用

哪些 JavaScript 公開方法采用了 SameValueZero 比較呢?

Array.prototype.includes

Map.prototype.delete

Map.prototype.has

Map.prototype.set

Set.prototype.delete

Set.prototype.has

Set.prototype.add

ArrayBuffer 和 DataView 部分方法

SameValue 內(nèi)部方法

SameValue 方法接收兩個參數(shù) x 和 y ,其中 x 和 y 是 EcmaScript 中任意類型值,該方法返回 truefalse

主要規(guī)則

如果 x 和 y 的類型不同,返回 false

如果 x 是 Number 類型:

如果 x 和 y 都是 NaN ,返回 true

如果 x 是 -0 ,y 是 +0 ,返回 false

如果 x 是 +0 ,y 是 -0 ,返回 false

如果 x 和 y 數(shù)值相等,返回 true

返回 false

返回 SameValueNonNumber(x, y) 方法的返回值。

小結(jié)

不同類型不相等

Number 類型中:±0 不相等。NaN 和 NaN 相等。其它相同數(shù)值相等

SameValueNonNumber 比較:

都是 undefined,相等

都是 null,相等

String 類型中,都是相同字符串,相等

Boolean 類型中,都是 true 或者 都是 false,相等

Symbol 類型中,都是相同 Symbol 值,相等

Object 類型中,引用同一對象,相等

使用

哪些 JavaScript 公開方法采用了 SameValue 比較呢?

Object.is

在最新的 ES 規(guī)范 中,你會發(fā)現(xiàn)許多其它內(nèi)部方法和公開方法都應(yīng)用了 SameValue 比較方法,其中大部分也沒有涉及數(shù)值比較。

至于為什么是 SameValue 方法,而不是 SameValueZero===。其實我也不知道。。。我個人傾向于認為:SameValue 方法原本在 ES5 規(guī)范中便存在了,最新的規(guī)范是為了保持規(guī)范一致而繼續(xù)沿用。

=== 嚴(yán)格相等運算

Strict Equality Comparison,x === y,返回 true 或者 false

主要規(guī)則

如果 x 和 y 的類型不同,返回 false

如果 x 是 Number 類型:

如果 x 是 NaN ,返回 false

如果 y 是 NaN ,返回 false

如果 x 和 y 數(shù)值相等,返回 true

如果 x 是 -0 ,y 是 +0 ,返回 true

如果 x 是 +0 ,y 是 -0 ,返回 true

返回 false

返回 SameValueNonNumber(x, y) 方法的返回值。

小結(jié)

不同類型不相等

Number 類型中:±0 相等。NaN 和 NaN 不相等。其它相同數(shù)值相等

SameValueNonNumber比較:

都是 undefined,相等

都是 null,相等

String 類型中,都是相同字符串,相等

Boolean 類型中,都是 true 或者 都是 false,相等

Symbol 類型中,都是相同 Symbol 值,相等

Object 類型中,引用同一對象,相等

使用

哪些 JavaScript 公開方法采用了 === 比較呢?

=== 嚴(yán)格相等運算

左右兩邊是相同類型的 == 相等運算

switch語句中的case

Array.prototype.indexOf

Array.prototype.lastIndexOf

== 相等運算

Abstract Equality Comparison,x == y,返回 true 或者 false

主要規(guī)則

如果 x 和 y 的類型相同:

返回嚴(yán)格相等運算結(jié)果 x === y 。

如果 x 是 null ,y 是 undefined ,返回 true

如果 x 是 undefined ,y 是 null ,返回 true

如果 x 是 Number 類型 ,y 是 String 類型,返回 x == ToNumber(y) 運算結(jié)果。

如果 x 是 String 類型 ,y 是 Number 類型,返回 ToNumber(x) == y 運算結(jié)果。

如果 x 是 Boolean 類型 ,返回 ToNumber(x) == y 運算結(jié)果。

如果 y 是 Boolean 類型 ,返回 x == ToNumber(y) 運算結(jié)果。

如果 x 是 Number、String、Symbol 中任意一個類型 ,y 是 Object 類型,返回 x == ToPrimitive(y) 運算結(jié)果。

如果 y 是 Number、String、Symbol 中任意一個類型 ,x 是 Object 類型,返回 ToPrimitive(x) == y 運算結(jié)果。

返回 false

小結(jié)

相同類型:遵循 === 嚴(yán)格相等比較規(guī)則。

null == undefined,相等

不同類型:

基本數(shù)據(jù)類型轉(zhuǎn)換為 Number 類型再 == 比較。

引用數(shù)據(jù)類型執(zhí)行內(nèi)部 ToPrimitive方法后再 == 比較。

使用

哪些 JavaScript 公開方法采用了 == 比較呢?

只有這只 == 相等運算

相等不相等

開頭的答案。如果對結(jié)果感到好奇,不妨對著上面的過程比對~

"0" == true         // false
[1] == [1]          // false
[1] == 1            // true
null == false       // false
null == undefined   // true
NaN === NaN         // false
+0 === -0           // true
Object.is([], [])   // false
Object.is(-0, +0)   // false。見SameValue
Object.is(NaN, NaN) // true。見SameValue

var arr = [NaN, 0, +0]
arr.indexOf(-0)     // 1。見===
arr.indexOf(NaN)    // -1。見===
arr.includes(-0)    // true。見SameValueZero
arr.includes(NaN)   // true。見SameValueZero
總結(jié)

SameValueZeroSameValue===這仨完全差不多嘛!

相同點:

- 不同類型即不相等。
- 相同類型遵從`SameValueNonNumber`規(guī)則。

不同點:對±0NaN 的判斷上各有不同。

Array.prototype.includes 為代表的SameValueZero

±0 相等

NaN 和 NaN 相等

Object.is 為代表的SameValue

±0 不相等

NaN 和 NaN 相等

===Array.prototype.indexOf 為代表的===

±0 相等

NaN 和 NaN 不相等

==

相同類型采用===嚴(yán)格比較。

不同類型會隱式轉(zhuǎn)換:

基本數(shù)據(jù)類型轉(zhuǎn)換為 Number 類型再 == 比較。

引用數(shù)據(jù)類型執(zhí)行 ToPrimitive 轉(zhuǎn)換后再 == 比較。

undefined/null 特例。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92237.html

相關(guān)文章

  • 數(shù)組方法的二三事

    摘要:常用的數(shù)組方法刪除數(shù)組的最后一個元素,返回被刪除的元素,原數(shù)組長度減。原數(shù)組發(fā)生了變化,但沒有創(chuàng)建新的數(shù)組。將指定數(shù)組進行排序,返回排好序的數(shù)組。顛倒數(shù)組元素的順序,返回逆序后的數(shù)組。 數(shù)組,對于每一個前端人員來說是非常常見且重要的數(shù)據(jù)結(jié)構(gòu)之一,也是面試常常出現(xiàn)的題目,掌握數(shù)組的方法能幫助我們更高效地處理問題。不過在數(shù)組的學(xué)習(xí)中,我們常常會混淆數(shù)組本身的方法和Javascript提供的...

    VincentFF 評論0 收藏0
  • 前端渲染過程的二三事

    摘要:前端渲染過程的二三事本文不會介紹整個前端渲染過程的步驟,只是記錄最近閱讀的文章的些許思考和感悟。那么現(xiàn)在我們可以明白這個問題的關(guān)鍵所在了,因為在大部分頁面中是擁有的,而由于其解析順序,那么在事件之前必定已經(jīng)成功構(gòu)造樹。 前端渲染過程的二三事 本文不會介紹整個前端渲染過程的步驟,只是記錄最近閱讀的文章的些許思考和感悟。(文章地址一(系列),文章地址二) 希望大家在閱讀這篇文章之前能將上述...

    Rindia 評論0 收藏0
  • 與dom事件流相關(guān)的二三事

    摘要:但對于整個事件流上的別的元素來說,執(zhí)行順序還會受到另外一個因素的影響。以上面的場景為例,在捕獲階段執(zhí)行的事件,如果執(zhí)行,則事件流終止,不會到達目標(biāo)階段,的世界則不會被執(zhí)行執(zhí)行結(jié)果為線上參考事件流 向dom綁定事件的事件的三種方式 行內(nèi)綁定 按鈕 js內(nèi)綁定 btnDom.onclick = function clickHandler() { console.log(click)...

    Anleb 評論0 收藏0
  • 分表后需要注意的二三事

    摘要:分表字段的選擇。問題產(chǎn)生之前提到在分表應(yīng)用上線前我們需要將原有表的數(shù)據(jù)遷移到新表中,這樣才能保證業(yè)務(wù)不受影響。雖說凌晨的業(yè)務(wù)量下降,但依然有少部分的請求過來,也會出現(xiàn)各種數(shù)據(jù)庫異常。 showImg(https://segmentfault.com/img/remote/1460000019462791?w=496&h=285); 前言 本篇是上一篇《一次分表踩坑實踐的探討》,所以還沒...

    dongxiawu 評論0 收藏0

發(fā)表評論

0條評論

wanghui

|高級講師

TA的文章

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