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

資訊專欄INFORMATION COLUMN

JS類(lèi)型(一):深入討論“==”與“===”

Wildcard / 922人閱讀

摘要:如果與相同,執(zhí)行嚴(yán)格相等運(yùn)算。如果是布爾值,返回的結(jié)果。,需要兩個(gè)操作數(shù)同時(shí)轉(zhuǎn)為。四附錄常見(jiàn)的引用對(duì)象轉(zhuǎn)基本類(lèi)型的例子對(duì)象或者非空對(duì)象轉(zhuǎn)基本類(lèi)型返回?cái)?shù)組轉(zhuǎn)基本類(lèi)型,返回?cái)?shù)組元素合集組成的字符串,每個(gè)元素用,連接

一:前言

寫(xiě)前端代碼的一個(gè)避不開(kāi)的問(wèn)題:“==” “===”到底是怎么回事?
下面是大眾的理解:

1. "=="指的是數(shù)值的相等。即使類(lèi)型不一致,轉(zhuǎn)化后的值相等,還是返回true
2. "==="指的是類(lèi)型和數(shù)值都相等,如果類(lèi)型不一致就直接呵呵了

然而記住了這些并沒(méi)有什么用,上面的說(shuō)法太不具體了,該出錯(cuò)的時(shí)候還是會(huì)出錯(cuò)。

二:正文

1.“==”是怎么回事?

0 == null 

上面的表達(dá)式返回true還是false??

在讀懂規(guī)格上,下面是算法細(xì)節(jié)。

ReturnIfAbrupt(x).
ReturnIfAbrupt(y).
If Type(x) is the same as Type(y), then
Return the result of performing Strict Equality Comparison x === y.
If x is null and y is undefined, return true.
If x is undefined and y is null, return true.
If Type(x) is Number and Type(y) is String,
return the result of the comparison x == ToNumber(y).
If Type(x) is String and Type(y) is Number,
return the result of the comparison ToNumber(x) == y.
If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
If Type(x) is either String, Number, or Symbol and Type(y) is Object, then
return the result of the comparison x == ToPrimitive(y).
If Type(x) is Object and Type(y) is either String, Number, or Symbol, then
return the result of the comparison ToPrimitive(x) == y.
Return false.

上面這段算法,一共有12步,翻譯如下。

如果x不是正常值(比如拋出一個(gè)錯(cuò)誤),中斷執(zhí)行。
如果y不是正常值,中斷執(zhí)行。
如果Type(x)與Type(y)相同,執(zhí)行嚴(yán)格相等運(yùn)算x === y。
如果x是null,y是undefined,返回true。
如果x是undefined,y是null,返回true。
如果Type(x)是數(shù)值,Type(y)是字符串,返回x == ToNumber(y)的結(jié)果。
如果Type(x)是字符串,Type(y)是數(shù)值,返回ToNumber(x) == y的結(jié)果。
如果Type(x)是布爾值,返回ToNumber(x) == y的結(jié)果。
如果Type(y)是布爾值,返回x == ToNumber(y)的結(jié)果。
如果Type(x)是字符串或數(shù)值或Symbol值,Type(y)是對(duì)象,返回x == ToPrimitive(y)的結(jié)果。
如果Type(x)是對(duì)象,Type(y)是字符串或數(shù)值或Symbol值,返回ToPrimitive(x) == y的結(jié)果。
返回false。

引用MDN上的一張圖就是:

由于0的類(lèi)型是數(shù)值,null的類(lèi)型是Null(這是規(guī)格4.3.13小節(jié)的規(guī)定,是內(nèi)部Type運(yùn)算的結(jié)果,跟typeof運(yùn)算符無(wú)關(guān))。因此上面的前11步都得不到結(jié)果,要到第12步才能得到false。

0 == null // false

上面12條規(guī)則,對(duì)于“==”部分可以用一張圖的總結(jié):

前面說(shuō)得很亂,根據(jù)我們得到的最終的圖3,我們總結(jié)一下==運(yùn)算的規(guī)則:

undefined == null,結(jié)果是true。且它倆與所有其他值比較的結(jié)果都是false。

String == Boolean,需要兩個(gè)操作數(shù)同時(shí)轉(zhuǎn)為Number。

String/Boolean == Number,需要String/Boolean轉(zhuǎn)為Number。

Object == Primitive,需要Object轉(zhuǎn)為Primitive(具體通過(guò)valueOf和toString方法)。

對(duì)這張圖的詳細(xì)介紹可以查看文章:https://segmentfault.com/a/11...
2.“===”又是怎么回事?
這個(gè)比較簡(jiǎn)單了,"==="是嚴(yán)格意義上的相等,必須要了類(lèi)型和值都相等才返回true,否則返回false。所以在判斷的時(shí)候比較容易就能看出來(lái)(一模一樣才是true)。

三.擴(kuò)展延伸

比較是否相等有三種方法:

=== 嚴(yán)格的相等

== 寬松的相等

Object.is

一張表格來(lái)說(shuō)明它們之間的區(qū)別:

這里主要注意 NaN 、 -0 +0這兩對(duì)表現(xiàn)得不一致情況。

四.附錄:常見(jiàn)的引用對(duì)象轉(zhuǎn)基本類(lèi)型的例子

1.對(duì)象({}或者非空對(duì)象)轉(zhuǎn)基本類(lèi)型返回"[object Object]"

const obj = {};
obj.toString();//"[object Object]"
obj.name="name";
obj.toString();//"[object Object]"

2.數(shù)組轉(zhuǎn)基本類(lèi)型,返回?cái)?shù)組元素合集組成的字符串,每個(gè)元素用","連接

[].toString();//""
[1,2].toString();//"1,2"
[[1,2],3].tonString();//"1,2,3"

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

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

相關(guān)文章

  • javascript知識(shí)點(diǎn)

    摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長(zhǎng)后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會(huì)討論安全的類(lèi)型檢測(cè)惰性載入函數(shù)凍結(jié)對(duì)象定時(shí)器等話題。 Vue.js 前后端同構(gòu)方案之準(zhǔn)備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當(dāng)初的 React,本人對(duì)寫(xiě)代碼有潔癖,代碼也是藝術(shù)。此篇是準(zhǔn)備篇,工欲善其事,必先利其器。我們先在代...

    Karrdy 評(píng)論0 收藏0
  • JavaScript深入淺出

    摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類(lèi)繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)?lái)幫助....(據(jù)說(shuō)是阿里的前端妹子寫(xiě)的) this 的值到底...

    blair 評(píng)論0 收藏0
  • 前端每周清單第 48 期:Slack Webpack 構(gòu)建優(yōu)化,CSS 命名規(guī)范用戶追蹤,Vue.

    摘要:發(fā)布是由團(tuán)隊(duì)開(kāi)源的,操作接口庫(kù),已成為事實(shí)上的瀏覽器操作標(biāo)準(zhǔn)。本周正式發(fā)布,為我們帶來(lái)了,,支持自定義頭部與腳部,支持增強(qiáng),兼容原生協(xié)議等特性變化。新特性介紹日前發(fā)布了大版本更新,引入了一系列的新特性與提升,本文即是對(duì)這些變化進(jìn)行深入解讀。 showImg(https://segmentfault.com/img/remote/1460000012940044); 前端每周清單專注前端...

    sean 評(píng)論0 收藏0
  • 【進(jìn)階1-3期】JavaScript深入之內(nèi)存空間詳細(xì)圖解

    摘要:進(jìn)階期理解中的執(zhí)行上下文和執(zhí)行棧進(jìn)階期深入之執(zhí)行上下文棧和變量對(duì)象但是今天補(bǔ)充一個(gè)知識(shí)點(diǎn)某些情況下,調(diào)用堆棧中函數(shù)調(diào)用的數(shù)量超出了調(diào)用堆棧的實(shí)際大小,瀏覽器會(huì)拋出一個(gè)錯(cuò)誤終止運(yùn)行。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開(kāi)始前端進(jìn)階的第一期,本周的主題是調(diào)用堆棧,今天是第3天。 本計(jì)劃一共28期,每期重點(diǎn)攻...

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

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

0條評(píng)論

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