==運(yùn)算符背后的原理

提問

相等運(yùn)算符(==)是一個(gè)讓人頭痛的運(yùn)算符,它的語法行為多變,不符合直覺。

請看下面的這個(gè)表達(dá)式,請問它們的值是多少。

0 == null

false == '0.0'

以及為什么?

破題

數(shù)據(jù)類型轉(zhuǎn)換表

ECMA規(guī)定了 == 運(yùn)算符具體的處理,我將其內(nèi)容整理,形成了如下的表格

類型 boolean string number symbol object null undefined
boolean === Number(boolean) == string Number(boolean) == number Number(boolean) == symbol Number(boolean) == object Number(boolean) == null Number(boolean) == undefined
string Number(boolean) == string === Number(string) == number false string == toPrimitive(object) false false
number Number(boolean) == number number == Number(string) === false number == toPrimitive(object) false false
symbol symbol == Number(boolean) false false === symbole == toPrimitive(object) false false
object object == Number(boolean) toPrimitive(object) == string toPrimitive(object) == number toPrimitive(object) == symbol === false false
null Number(boolean) == null false false false false === true
undefined Number(boolean) == undefined false false false false true ===

轉(zhuǎn)換表內(nèi)容解析

以上的表格雖然表達(dá)的很清楚,但是我們翻閱的時(shí)候,可能會(huì)覺得繁瑣,所以我們在這里將上面的表格進(jìn)行一次提煉整理。

我們在分析上面的內(nèi)容的時(shí)候,發(fā)現(xiàn)以下規(guī)律

  • null == undefined 結(jié)果為true
  • null | undefined 與 其他類型比較均為 false
  • string | number | symbol == object 會(huì)將使用toPrimitive將object轉(zhuǎn)換為原始類型數(shù)據(jù),在進(jìn)行比較(ps: 稍后會(huì)補(bǔ)一篇文章用來解釋toPrimitive的行為)
  • symbol == string | number 比較均為 false
  • boolean == number | string 比較會(huì)轉(zhuǎn)為 number
  • string == number 比較會(huì)轉(zhuǎn)為 number

揭曉答案

現(xiàn)在我們回到前言中提到的問題,通過正文中的學(xué)習(xí),我想我們可以快速而且非常自信的回答出答案了。

0 == null // false

false == '0.0' // true

怎么樣,小伙伴們是不是都回答正確了呢。

下面讓我們來具體的分析下上面兩道題。

  • 0 == null

    考的知識(shí)點(diǎn)是 null 與 非 null | undefined 比較返回均為false

  • false == '0.0'

    這道題需要進(jìn)行以下三步,方能得到答案

    1: Number(false) == '0.0' 得到 0 == '0.0

    2: 0 == Number('0.0') 得到 0 == 0.0

    3: 0 === 0.0 // true

ECMA算法參考

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.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,854評論 0 10
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,916評論 0 13
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 3,202評論 0 3
  • 第三天 大年初三,足夠熱鬧的一天,但是心里很孤單,被很多親戚問到對象這個(gè)問題,我說沒有,每次回答沒有都會(huì)想起他,心...
    卡在領(lǐng)口的土撥鼠閱讀 342評論 0 0
  • 文章轉(zhuǎn)自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaif...
    xpengb閱讀 423評論 0 1

友情鏈接更多精彩內(nèi)容