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

資訊專欄INFORMATION COLUMN

JavaScript "相等" 的二三事

wanghui / 2442人閱讀

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

相等不相等?

先來隨便舉幾個(gè)?吧~

"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)    //?

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

預(yù)備知識(shí) 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ù)字 -> 十進(jìn)制數(shù)字,其它 -> NaN
Object 先ToPrimitive(hint Number),再ToNumber
Symbol 拋錯(cuò),TypeError 錯(cuò)誤
ToPrimitive

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

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

hint有三種:default、number、stringdefault 默認(rèn)遵照 number 規(guī)則。

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

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

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

-0、+0、0 的疑惑

明明日常沒什么卵用,為什么會(huì)有±0?

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

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

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

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

PS

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

SameValueNonNumber 內(nèi)部方法

SameValueNonNumber 方法接收兩個(gè)參數(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 指向同一對(duì)象,返回 true 。否則返回 false 。

小結(jié)

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

都是 undefined,相等。

都是 null,相等

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

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

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

Object 類型中,引用同一對(duì)象,相等。

使用

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

公開方法木有

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

SameValueZero 內(nèi)部方法

SameValueZero 方法接收兩個(gè)參數(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 類型中,引用同一對(duì)象,相等。

使用

哪些 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 方法接收兩個(gè)參數(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 類型中,引用同一對(duì)象,相等。

使用

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

Object.is

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

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

=== 嚴(yán)格相等運(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 類型中,引用同一對(duì)象,相等。

使用

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

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

左右兩邊是相同類型的 == 相等運(yùn)算

switch語句中的case

Array.prototype.indexOf

Array.prototype.lastIndexOf

== 相等運(yùn)算

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

主要規(guī)則

如果 x 和 y 的類型相同:

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

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

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

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

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

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

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

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

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

返回 false 。

小結(jié)

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

null == undefined,相等

不同類型:

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

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

使用

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

只有這只 == 相等運(yùn)算

相等不相等

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

"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、===這仨完全差不多嘛!

相同點(diǎn):

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

不同點(diǎn):對(duì)±0、NaN 的判斷上各有不同。

Array.prototype.includes 為代表的SameValueZero

±0 相等

NaN 和 NaN 相等

Object.is 為代表的SameValue

±0 不相等

NaN 和 NaN 相等

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

±0 相等

NaN 和 NaN 不相等

==

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

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

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

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

undefined/null 特例。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92237.html

相關(guān)文章

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

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

    VincentFF 評(píng)論0 收藏0
  • 前端渲染過程的二三事

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

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

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

    Anleb 評(píng)論0 收藏0
  • 分表后需要注意的二三事

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

    dongxiawu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

wanghui

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<