js中關於假值和空數組的總結


先上x==y運算符的算法細節:

  1. 如果x不是正常值(比如拋出一個錯誤),中斷執行。
  2. 如果y不是正常值,中斷執行。
  3. 如果Type(x)Type(y)相同,執行嚴格相等運算x === y
  4. 如果xnullyundefined,返回true
  5. 如果xundefinedynull,返回true
  6. 如果Type(x)是數值,Type(y)是字符串,返回x == ToNumber(y)的結果。
  7. 如果Type(x)是字符串,Type(y)是數值,返回ToNumber(x) == y的結果。
  8. 如果Type(x)是布爾值,返回ToNumber(x) == y的結果。
  9. 如果Type(y)是布爾值,返回x == ToNumber(y)的結果。
  10. 如果Type(x)是字符串或數值或Symbol值,Type(y)是對象,返回x == ToPrimitive(y)的結果。
  11. 如果Type(x)是對象,Type(y)是字符串或數值或Symbol值,返回ToPrimitive(x) == y的結果。
  12. 返回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,不等於任何數包括自己

最后送大家一張經典的圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM