js中關於假值和空數組的總結
- 2019 年 10 月 4 日
- 筆記
先上x==y運算符的演算法細節:
- 如果
x
不是正常值(比如拋出一個錯誤),中斷執行。 - 如果
y
不是正常值,中斷執行。 - 如果
Type(x)
與Type(y)
相同,執行嚴格相等運算x === y
。 - 如果
x
是null
,y
是undefined
,返回true
。 - 如果
x
是undefined
,y
是null
,返回true
。 - 如果
Type(x)
是數值,Type(y)
是字元串,返回x == ToNumber(y)
的結果。 - 如果
Type(x)
是字元串,Type(y)
是數值,返回ToNumber(x) == y
的結果。 - 如果
Type(x)
是布爾值,返回ToNumber(x) == y
的結果。 - 如果
Type(y)
是布爾值,返回x == ToNumber(y)
的結果。 - 如果
Type(x)
是字元串或數值或Symbol
值,Type(y)
是對象,返回x == ToPrimitive(y)
的結果。 - 如果
Type(x)
是對象,Type(y)
是字元串或數值或Symbol
值,返回ToPrimitive(x) == y
的結果。 - 返回
false
。
1、「假值」總共只有6個: false,undefined,null,0,""(空字元串),NaN 除此之外的所有值,都是「真值」,即在邏輯判斷中可以當true來使用
用程式碼表示:
if(false&&undefined&&null&&0&&""&&NaN){ console.log('其中有真值'); }else{ console.log('全部都是假值'); } //全部都是假值
2、對於空數組和空對象的疑惑
疑惑來源:用空數組和空對象進行if語句判斷為true,但是空數組和true進行==運算時,返回的是false
用程式碼表示:
if([]){ console.log('空數組轉化為布爾值為true');//空數組轉化為布爾值為true } if({}){ console.log('空對象轉化為布爾值為true');//空對象轉化為布爾值為true } if([]==true){ console.log('空數組等於true'); }else{ console.log('空數組等於false');//空數組等於false }
為什麼空數組轉化為布爾值是true,而下面和true做對比時又不等於true呢?
原因分析:if ([ ]) {} 里發生自動類型轉換,[ ] => Boolean,從object到布爾型,結果是true。事實上,所有的object轉型到Boolean,都是true,[ ]和{ }都是對象。
[ ] == true 里不發生自動類型轉換,這條語句只比較左右的「值」是否相等,所以要先化為number類型,true轉化為數字1就不用說了,主要分析一下[ ]怎麼轉化為0的,這裡涉及到ToPrimitive方法的操作,不懂的可以先看我的另一篇部落格,https://i.cnblogs.com/EditPosts.aspx?postid=10859000,再返回看。
[ ]會先調用valueOf方法,返回數組本身不是原始值,所以繼續調用toString方法,返回' ',從而Number(' ')=0,而0!=1,所以返回false。
總結:Boolean([ ]) => true;//直接作條件 Boolean(Number([ ])) => false;//當與布爾值做比較時
Number({ })//NaN,不等於任何數包括自己
最後送大家一張經典的圖:
