空數組返回true引起的血案

    以前作項目的時候,總會處理各式各樣的數據,來進行繪圖。可是當後臺返回一個空數組的時候,頁面中並不會顯示沒有數據的圖。代碼以下:javascript

var arr = []
if(arr){console.log(124)}else{console.log('無數據')}

我明明判斷了,怎麼會不顯示呢?下面咱們就來看看,具體是怎麼回事。java

'==' 和 '==='

    比較大小,只有數字能進行比較,因此全部比較類型最終都會轉爲數字進行。非全等(==)的狀況下,只要值相同就返回True。而全等(===)的時候須要值和類型都要匹配才能返回True。即在非全等的狀況下,要進行類型轉換。全等條件下則不進行類型轉換。
1、 非全等條件下數組

  • 若兩個操做數類型相同,若值不相等,則不相等。反則相等。函數

  • 若兩個操做數類型不一樣,若檢測相等,則須要遵循如下規則spa

    • 若一個值爲null,另外一個爲undefined,則他們相等code

    • 若一個值爲數字,另外一個是字符串,則會先將字符串轉換爲數字,而後使用轉後的值進行比較對象

    • 若其中一個值爲true,則將其轉換爲1再進行比較。若其中一個爲false,則轉爲0再進行比較blog

    • 若一個值是對象,另外一個值是數字或字符串,則會使用valueOf(),再嘗試使用toString(),除了日期類,日期類只使用toString()轉換(注:後面會細說,先記住這些規則)繼承

    • 其餘不一樣類型之間的比較均不相等。圖片

    {'a': 1} == {'a': 2} // false
    1 == 1 //true
    null == undefined // true
    true == 1 //true
    false == 0 // true
    ({}) == 0 // false  解釋: ({}).valueOf 返回其自己 Object {},則而後進行toString()轉換"[object Object]",則轉換爲數字爲NaN,因此{}!=0同時{}!=1
    [] == true // false  解釋: [].valueOf 返回其自己 [],則而後進行toString()轉換"" 則其轉換爲數字0

2、 全等條件下

  • 若兩個值類型不相同,則他們不相等

  • 若兩個值都是null或者undefined,則他們相等

  • 若兩個值都是true或都是false,則他們相等

  • 若其中一個值是NaN,或者兩個值都是NaN,則他們不相等。NaN和其餘任何值都不相等,包括其自己! 經過x!==x來判斷NaN,只有在x爲NaN的時候,這個表達式的值才爲true。

  • 若兩個是數字且數值相等,則他們相等。若是一個爲0,另外一個爲-0,則他們一樣相等

  • 若兩個值爲字符串,且所含的對應位上的數值也徹底相等。則他們相等

  • 若兩個引用值指向同一個對象、數組或函數,則他們是相等的。若指向不一樣的對象,則他們不等,即使兩個對象具備徹底同樣的屬性

    例子就不一一列舉了

類型轉換

    類型轉換以下:
圖片描述

注:基本類型(原始類型值): String、Number、Boolean、undefined、null
對於類型轉換,咱們須要記住以下幾個轉換。undefined、null、0、-0、NaN、''都將轉爲false。全部其餘值,包括全部對象(數組)都會轉爲true。那麼按照這麼來講,[] == true應該返回true啊?爲何是false呢?由於在執行相等判斷的時候都轉化爲了數字,這兩個值是不相等。可是在if([]){console.log(1)}這個判斷的狀況下,則會很神奇的發現打印出來了1,說明[]此時爲true,爲何呢?由於這裏執行了一個對象到布爾值的轉換故返回true。(注:這裏能夠理解爲對象轉爲布爾值和對象轉換爲數字的差別)

上面說了對象轉化爲布爾值,這裏再細說一下對象轉換爲字符串和對象轉換爲字符串

對象轉換爲字符串

a、若是對象具備toString()方法,則調用這個方法。若是它返回一個原始值,js將這個值轉換爲字符串(若自己不是字符串),並返回這個字符串結果。

({a:1}).toString() ----> "[object Object]"

b、若對象沒有toString()方法,或者這個方法返回的不是一個原始類型值,那麼js就會調用valueOf()。若是存在這個方法,則js調用它。若返回值是原始類型值,js將這個值轉換爲字符串,並返回這個結果。
c、若js沒法從toString()或valueOf()得到一個原始值,則將拋出一個類型錯誤異常

對象轉換爲數字

a、對象轉換爲數字和對象轉換爲字符串作的事同樣,可是它會先嚐試使用valueOf()
b、若對象有valueOf(),則返回一個原始值,而後js將其轉換爲數字返回。不然,如有toString()方法,返回原始值,而後js將其轉換爲數字返回。若二者都沒有,則拋出一個類型錯誤異常

[] == 0 //true  釋義:數組繼承了默認的valueOf()方法,這個方法返回一個對象而不是一個原始類型值,所以,數組到數字的轉換則調用toString()方法。空數組轉換爲空字符串,空字符串轉爲數字0

案例

看完上面的解釋,分析一下下面的例子

({}) == ({}) // false
[] == ![] // true
[] == [] // false
![] == true // false
'' == '0' // false
'' == 0  // true
false == 'false' // false
false == undefined // false
false == null  // false

其中某個問題的解釋會牽扯到運算符優先級的問題。參考地址:
[https://developer.mozilla.org...

文章首發於 [http://www.17biu.cn]

相關文章
相關標籤/搜索