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

資訊專欄INFORMATION COLUMN

你真的理解==和===的區(qū)別嗎?

TwIStOy / 612人閱讀

摘要:上面的理解是錯的,和返回就可以推翻。解釋不清楚和是相等的。和的規(guī)則類似,唯一少了轉(zhuǎn)換的一步。三高級階段參考規(guī)范真正理解真的如高設(shè)所說的那樣嗎其實不然。來分析一個經(jīng)典的例子,看完徹底理解的強(qiáng)制轉(zhuǎn)換。

用中文怎么叫合適?
相等?全等?
其實并不合適,叫double equals 或者treble equals,或者叫不懂的人覺得比較不專業(yè)的雙等或者三等操作符,是更加嚴(yán)謹(jǐn)和正確的叫法。
為什么這么說?看完這篇博客你就明白了。

一、入門階段:自我經(jīng)驗(一腳一坑)

我的理解是:
==是相等,值相等,返回true。
===是全等,值相等,類型也相等,返回true。

上面的理解是錯的,[]==false[1]===[1]返回就可以推翻。[]==false,他們的值并不相等,但是返回true。[1]和[1],值相等,類型也相等,返回為false。因此上面理解是錯的。

正確的理解是:

**==是相等,先轉(zhuǎn)換再比較,返回true。
===是全等,不轉(zhuǎn)換就比較,返回true。**

[]==false,false是轉(zhuǎn)換為0,[]強(qiáng)制轉(zhuǎn)換成0(解釋不清楚),0 == 0 ,返回為true。
[1] === [1],不轉(zhuǎn)換就比較,[1]===[1],左右的[1]指向內(nèi)存中兩個獨立的,地址不同的數(shù)組,故返回false。

看下最簡單的例子:
①基礎(chǔ)類型vs基礎(chǔ)類型
1== true //true
1 === true //false
再看兩個復(fù)雜的例子:
②對象vs基礎(chǔ)類型*
[] == false //true
[] === false //false
③對象vs對象
{age:6} == {age:6} //false
{age:6} === {age:6} //false
[1] == [1] //false
[1] === [1] //false

二、初級階段:參考書籍(勉強(qiáng)避雷)

聰明的你會問了,[] == falsefalse == []的結(jié)果一致嗎?
答案是一致的,因為無論再操作符左側(cè)還是右側(cè),它們都是操作數(shù),位置是沒有關(guān)系的。

為什么會出現(xiàn)上面的結(jié)果?

為什么 1 == true[] == false返回true?
因為type coercion的存在,高設(shè)翻譯為強(qiáng)制轉(zhuǎn)型。
為什么會出現(xiàn)強(qiáng)制轉(zhuǎn)換類型?
強(qiáng)制轉(zhuǎn)換了誰的類型?
轉(zhuǎn)換成了什么類型?

為什么{age:6} == {age:6}返回的是false?
他們看起來不是一樣的嗎,都是一個object,而且內(nèi)部數(shù)據(jù)都是age:6,key-value值一模一樣,為什么不返回true呢?

如果再在操作數(shù)中加入nullundefined這兩個神奇的類型呢?
問題就變的更復(fù)雜了...

來看下《Javascript高級程序設(shè)計》關(guān)于==和===的規(guī)則

1.如果有一個操作數(shù)是布爾值,則在比較前先將其轉(zhuǎn)換為數(shù)值,true轉(zhuǎn)換為1,false轉(zhuǎn)換為0,例如false == 0,true == 1
2.如果一個操作數(shù)是字符串,另一個操作數(shù)是數(shù)值,先將字符串轉(zhuǎn)換成數(shù)值,例如"1"==1,"" ==0
3.如果一個操作數(shù)是對象,另一個操作數(shù)不是,則調(diào)用對象的valueOf()方法,用得到的基本類型按照前面的規(guī)則進(jìn)行比較。(解釋不清楚)
4.null和undefined是相等的。
5.如果有一個數(shù)是NaN,則相等操作符返回false,而不想等操作符返回true。NaN == NaN返回為false,因為規(guī)則如此。
6.如果兩個操作數(shù)是對象,則比較它們是不是同一個對象。如果兩個操作數(shù)都指向同一個對象,則相等操作符返回true,否則返回false。

例如:var obj = {a:1};foo = obj;bar = obj;foo==bar;foo==bar返回為true,因為他們指向同一個對象,obj。

===和==的規(guī)則類似,唯一少了轉(zhuǎn)換的一步。
第6步中的foo===bar返回true,如果不明白為什么?請看第三部分。

三、高級階段:參考規(guī)范(真正理解)

真的如高設(shè)所說的那樣嗎?其實不然。
下面是ecma-262的規(guī)范,其中有對==和===的執(zhí)行定義,把解釋不清楚干掉。
https://www.ecma-internationa...
7.2.13 Abstract Equality Comparison

The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed
as follows:
1. If Type(x) is the same as Type(y), then
a. Return the result of performing Strict Equality Comparison x === y.
2. If x is null and y is undefined, return true.
3. If x is undefined and y is null, return true.
4. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
5. If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.
6. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
7. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
8. If Type(x) is either String, Number, or Symbol and Type(y) is Object, return the result of the
comparison x == ToPrimitive(y).
9. If Type(x) is Object and Type(y) is either String, Number, or Symbol, return the result of the
comparison ToPrimitive(x) == y.
10. Return false.

7.2.14 Strict Equality Comparison

The comparison x === y, where x and y are values, produces true or false. Such a comparison is performed
as follows:
1. If Type(x) is different from Type(y), return false.
2. If Type(x) is Number, then
a. If x is NaN, return false.
b. If y is NaN, return false.
c. If x is the same Number value as y, return true.
d. If x is +0 and y is ?0, return true.
e. If x is ?0 and y is +0, return true.
f. Return false.
3. Return SameValueNonNumber(x, y).
NOTE This algorithm differs from the SameValue Algorithm in its treatment of signed zeroes and
NaNs.

1.[]==false
來分析一個經(jīng)典的例子:[]==false,看完徹底理解==的強(qiáng)制轉(zhuǎn)換。
①[]==false→[]==0

7.If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).


經(jīng)過ToNumber(false),false會被轉(zhuǎn)換為0.
②[]==0→""==0

9.If Type(x) is Object and Type(y) is either String, Number, or Symbol, return the result of the
comparison ToPrimitive(x) == y

這個時候就比較復(fù)雜了...

按照規(guī)范,我們需要經(jīng)過下面的一系列操作

→OrdinaryToPromitive([],default)
→OrdinaryToPromitive([],number)
→Get([],valueOf)
→Call(valueOf,[])
→Get([],toString)
→Call(toString,[])
→""

不要慌,用Javascript來描述,還是很簡單的:

[].valueOf().toString()

③""==0→0==0

If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.

2.[1]===[1]
再來看下===操作符,其中有句話可以完美解釋[1]===[1]返回false,但是var obj = {a:1};foo = obj;bar = obj;foo===bar中foo===bar返回為true的原因。

Return SameValueNonNumber(x, y).

由于[1]===[1]三等號左右的[1],不是same Object,因此返回為false.
而foo===bar,三等號左右其實本質(zhì)上都是指向obj這個對象,值相等更是必然,所以返回為true。

我們由此可以舉一反三,[1]==true返回true,而[1,2,3]==true返回false的原因也不足為奇了。

如有錯誤歡迎指正說明,期待和你交流~
努力成為優(yōu)秀的前端工程師~

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

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

相關(guān)文章

  • 理解機(jī)器學(xué)習(xí)中偏差 - 方差之間權(quán)衡?

    摘要:機(jī)器學(xué)習(xí)中的偏差方差之間的權(quán)衡機(jī)器學(xué)習(xí)全部是關(guān)于給定輸入數(shù)據(jù)和給定輸出數(shù)據(jù),然后去尋找一個最佳映射函數(shù),這個映射函數(shù)通常也被叫做目標(biāo)函數(shù)。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:http://www.jianshu.com/p/f143... 我認(rèn)為對偏差 - 方差之間的權(quán)衡判讀對學(xué)習(xí)機(jī)器學(xué)習(xí)是非常重要的。那么為什么這么說呢?因為...

    lastSeries 評論0 收藏0
  • 理解=====

    摘要:開門見題說出以下幾個表達(dá)式的結(jié)果張三張三補(bǔ)充知識要想回答上述問題,必須理解在執(zhí)行時候的一些數(shù)據(jù)轉(zhuǎn)換規(guī)則和成文的規(guī)定。根據(jù)上面第二條,寫的明明白白,結(jié)果是。。根據(jù),由于和指向不同引用,所以返回。 開門見題 說出以下幾個表達(dá)式的結(jié)果 var obj1 = { name: 張三} var obj2 = obj1 var obj3 = { name: 張三} null == undefine...

    Barrior 評論0 收藏0
  • 2019前端工程師自檢清單與思考

    摘要:前端工程師自檢清單對于,掌握其語法和特性是最基本的,但是這些只是應(yīng)用能力,最終仍舊考量仍然是計算機(jī)體系的理論知識,所以數(shù)據(jù)結(jié)構(gòu),算法,軟件工程,設(shè)計模式等基礎(chǔ)知識對前端工程師同樣重要,這些知識的理解程度,可以決定你在前端工程師這條路上能走多 2019前端工程師自檢清單 對于JavaScript,掌握其語法和特性是最基本的,但是這些只是應(yīng)用能力,最終仍舊考量仍然是計算機(jī)體系的理論知識,所...

    Honwhy 評論0 收藏0
  • 容器容器鏡像區(qū)別,您了解

    摘要:我們首先來看容器和容器鏡像。容器和容器鏡像一樣,也是若干層的疊加,唯一區(qū)別是所有只讀層的最上面一層,是一層可讀可寫層,如上圖綠色圖例所示。希望這篇文章能幫助大家理解容器和容器鏡像的區(qū)別。 很多剛剛接觸容器技術(shù)的朋友,不容易弄清楚容器,容器鏡像和Docker這幾個詞的區(qū)別和聯(lián)系。 showImg(https://segmentfault.com/img/remote/1460000017...

    zengdongbao 評論0 收藏0

發(fā)表評論

0條評論

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