天天一個lodash方法-compact

compact源碼javascript

功能

Creates an array with all falsey values removed. The values false, null, 0, "", undefined, and NaN are falsey.java

新建一個移除了全部falsey值的數組。 false, null, 0, "", undefined, and NaN 都是falsey值。(移除全部假值並返回一個新的數組)git

使用

compact([0, 1, false, 2, '', 3])
// => [1, 2, 3]

自行實現

function compact(array){
    if(!Array.isArray) return [] //傳入的不是數組,直接返回空數組
    
    var result = []
    
    var isFalse = function(){}
    for(var i = 0;i<array.length; i++){
        if(array[i]){
            result.push(array[i])
        }
    }
    
    return result
}

lodash實現方式

function compact(array) {
  let resIndex = 0 // 下標
  const result = [] // 結果集

  if (array == null) { #1
    return result
  }

  for (const value of array) { // 遍歷數組,直接取出數組
    if (value) {
      result[resIndex++] = value
    }
  }
  return result
}

array == null

array == null,源碼中這裏,實際上是傳入不符合規則的array參數,直接返回一個空數組。若是傳入一個數組,會正常進行下去,github

等等,我好像讀錯源碼了。算法

master裏的compact有問題。若是我傳入一個false,那麼當前這個compact會報錯。通過仔細查找,在npm-package這個分支裏的代碼應該是正確的。npm

function compact(array) {
  var index = -1,
      length = array ? array.length : 0,
      resIndex = 0,
      result = [];

  while (++index < length) {
    var value = array[index];
    if (value) {
      result[resIndex++] = value;
    }
  }
  return result;
}

length = array ? array.length : 0這裏。若是傳入的是其它類型的值。接下來的都會不符合while loop的判斷條件,直接返回一個空數組。數組

condition 1,傳入的是字符串abc,返回一個['a','b','c']
condition 2,傳入的是一個function,返回一個[]函數

引伸出來的問題

6個假值

這裏有相關的解答oop

false, null, 0, "", undefined, and NaN.this

iffalse){}else{}if函數體內值若是是6個之一都會執行else裏的邏輯。

但是

null == false

null == 0

null == ''

以上無一例外都是false

可是

!null == !false       // returns true

!null == !0           // returns true

!false == !undefined  // returns true
null == undefined     // returns true

false == 0            // returns true

==規則描述

開發中,比起使用==我更傾向於===,由於它更讓人模糊不清。

==並非簡單的進行一個boolean的隱士轉換再取比較值。而是經過一個比較複雜的遞歸算法,再檢查類型以後,嘗試不一樣類型的數據強制喂轉換爲相同的類型

下邊是我copy過來的規則,x,y爲不一樣的類型狀況下的算法邏輯。

  • If x is null and y is undefined, return true.

    // so null == undefined => true

  • If x is undefined and y is null, return true.
    // so und == null true
  • If Type(x) is Number and Type(y) is String,return the result of the comparison x == ToNumber(y).
    // 1 == "1" => 1== Number("1") => true
  • If Type(x) is String and Type(y) is Number,return the result of the comparison ToNumber(x) == y.
    // "2" ==2 => Number("2") == 2 => true
  • If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
    // true == 1 => Number(true) == 1 => 1==1 => true
  • If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
    // 上邊左右對掉。
  • If Type(x) is either String or Number and Type(y) is Object,return the result of the comparison x == ToPrimitive(y).
  • If Type(x) is Object and Type(y) is either String or Number,return the result of the comparison ToPrimitive(x) == y.
    //
  • Return false.
    //這就像是switch的default操做。

關於對象,涉及到了ToPrimitive(),須要研究下,暫時不討論。以上基本解釋了 null ==操做爲什麼返回false

關於!操做相關的比較。

使用了!之後至關於作了一個toBoolean轉換,類型匹配,這避免了算法的類型強制部分,使其行爲基本上像嚴格相等(===)。
連接描述

爲何undefined == null 爲true

這個上邊解釋咯。規範定義了undefined ==的算法。

至於NaN是個奇葩,它跟本身都不想等。因此==永遠都是false
this is answer link

相關文章
相關標籤/搜索