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 }
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參數,直接返回一個空數組。若是傳入一個數組,會正常進行下去,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,返回一個[]
函數
這裏有相關的解答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爲不一樣的類型狀況下的算法邏輯。
// so null == undefined => true
關於對象,涉及到了ToPrimitive(),須要研究下,暫時不討論。以上基本解釋了 null ==操做爲什麼返回false
關於!操做
相關的比較。
使用了!
之後至關於作了一個toBoolean轉換,類型匹配,這避免了算法的類型強制部分,使其行爲基本上像嚴格相等(===
)。
連接描述
這個上邊解釋咯。規範定義了undefined ==的算法。
至於NaN是個奇葩,它跟本身都不想等。因此==永遠都是false
this is answer link