前端碎碎念 之 為什麼

2021-09-17 02:21:10 字數 1392 閱讀 2023

類似標題中的問題還有很多,例如:

為什麼 [ ] == false 而 !![ ] == true

or

[1] == [1] 是true 還是 false

如果對==操作符一知半解,就很難解答類似的問題。我們直接開門見山,看看==是如何工作的,這裡的難點主要涉及到js中的隱式強制型別轉換。

判斷步驟如下:

如果有乙個運算元是布林值,則在比較相等性之前先將其轉換為數值----false轉換為0,而true轉換為1。

如果乙個運算元是字串,另乙個運算元是數值,在比較相等性之前先將字串轉換為數值。

如果乙個運算元是物件,另乙個運算元不是,則呼叫物件的valueof()方法,如果得到的值不是基本型別值,則基於返回值再呼叫tostring方法(這個過程即toprimitive),用得到的基本型別值按照前面的規則進行比較。

如果兩個運算元都是物件,則比較他們是不是同乙個物件。如果兩個運算元指向同乙個物件,則相等操作符返回true, 否則返回false。

這兩個操作符在進行比較時則要遵循下列規則。

null 和 undefined 是相等的。

要比較相等性之前,不能將null和undefined轉換成其他任何值

如果有乙個運算元是nan,則相等操作符返回false, 而不相等操作符則返回true, nan != nan

我畫了乙個圖來表示這個過程:

根據上面的步驟,來分析 == ! 為什麼會返回true

== !

!運算子的優先順序大於 ==,所以實際上這裡還涉及到!的運算。

這個比較簡單!會將後面的值轉化為布林值。即!變成!boolean(), 也就是!true,也就是false。

實際上是對比== false;

運用上面的順序,false是布林值,所以轉化為數值number(flase), 為0。

對比== 0;

滿足第三條規則 是物件(陣列也屬於物件),0不是物件。所以toprimitive()是""

對比"" == 0;

滿足第二條規則,"" 是字串,0是數值,對比number("") == 0, 也就是 0 == 0。

所以得出== !

我們可以用同樣的方法對上面提到的兩個等式例子進行判斷,都能得出結論。雖然過程有點麻煩,但是本質上就是將兩邊的比較值轉化為數值進行比較。讀者可以自行嘗試實踐。

生活碎碎念

工作後,總是會有各種各樣的場合介紹自己,姓名呀 愛好啦 哪的人呢 每每說到愛好,總是覺得不知道應該怎樣表達。我喜歡旅行,喜歡美食,喜歡做飯 中餐西餐各種料理,對牛排和義大利面情有獨鍾 我也喜歡運動啊,籃球足球羽毛球 當然啦,籃球足球只是圍觀,是科比和梅西的無腦粉絲 喜歡滑冰和滑雪 技術雖不高,但也算...

技術碎碎念

註冊過後還沒怎麼來過,這次面試在最後一輪失敗了,不可推卸的是自己沒把相關思考與想法記錄下來,好記性不如亂鼻頭。回來後發了會兒呆。想到今天召開大家開會的時候,有人提出策劃發現bug了不要馬上就跑過來了,打斷思緒,上個bug還沒解決就又帶入了混亂。剛開始想是不是要用個管理工具,比如禪道,來管理這些問題,...

今日碎碎念

先匯報一下今天的工作。早上看了 物流案例 的 物流系統評價 與 物流系統 兩章,收穫頗豐,待會會將所得所感一一記錄下來。中午12點準時出發,奔赴華工五山區參加廣東移動在14點舉行的筆試,感想多多,待會也一併記下來。下午5點半左右回到宿舍,開啟電腦,滿心希望flexsim系統可以正常執行,結果搗鼓了近...