摘要:如果與相同,執(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)。
比較是否相等有三種方法:
=== 嚴(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
摘要:模塊化是隨著前端技術(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)備篇,工欲善其事,必先利其器。我們先在代...
摘要:理解的函數(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 的值到底...
摘要:發(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); 前端每周清單專注前端...
摘要:進(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)攻...
閱讀 1603·2021-09-30 09:47
閱讀 3609·2021-09-22 15:05
閱讀 2842·2021-08-30 09:44
閱讀 3626·2019-08-30 15:55
閱讀 1377·2019-08-30 13:08
閱讀 1332·2019-08-29 16:40
閱讀 557·2019-08-29 12:45
閱讀 1393·2019-08-29 11:25