2016-03-30 246 views
0

這可能是因爲我今天早上我只是非常虛弱,但我無法理解爲什麼它返回的true需要澄清認識_.some()

_.some([null, 0, 'yes', false]); // true 

我知道_.some()返回true如果至少有一個元素將謂詞測試視爲true。但根據我的理解,如果沒有提供謂詞,則使用_.identity()。但console.log單獨使用_.identity()這些元素的任何一個都沒有返回true。那麼它爲什麼會迴歸真實?

+5

''yes''是真的。 – zwol

回答

2

沒有謂詞,some使用identity,它使用該值本身,'yes'是truthy。

通過快速跳水the annotated source(特別關注cb和失蹤謂詞存在的處理)給你留下,本質上來說,當他們做了強迫布爾:

if (predicate(obj[currentKey], currentKey, obj)) return true; 

沒有謂語意味着你在那裏使用原始值,所以if ('yes'),這是真的。

你不是在控制檯中看到true任何這些值,因爲_.identity將返回值本身(所以'yes'),而不是它強迫爲布爾值。如果你要做!!'yes'(強制和雙重否),你會看到true

1

它並不需要返回字面值true,它只需要返回一個值truthy(雖然你總是應該只返回布爾值)。

non-empty string 'yes' is truthy(您可以通過Boolean('yes')!!'yes'測試)。

2

'yes'是truthy:

_.some([null]) // false 
_.some([0])  // false 
_.some(['yes']) // true 
_.some([false]) // false 

the Truth, equality in javascript link

的構建如果(表達式)聲明將迫使使用抽象方法ToBoolean的量,表達式評估爲布爾的結果ES5規範定義了以下算法:

string:如果爭論的結果是錯誤的ment是空字符串(它的長度爲零);否則結果是真的。