這可能是因爲我今天早上我只是非常虛弱,但我無法理解爲什麼它返回的true
:需要澄清認識_.some()
_.some([null, 0, 'yes', false]); // true
我知道_.some()
返回true如果至少有一個元素將謂詞測試視爲true。但根據我的理解,如果沒有提供謂詞,則使用_.identity()
。但console.log單獨使用_.identity()
這些元素的任何一個都沒有返回true
。那麼它爲什麼會迴歸真實?
這可能是因爲我今天早上我只是非常虛弱,但我無法理解爲什麼它返回的true
:需要澄清認識_.some()
_.some([null, 0, 'yes', false]); // true
我知道_.some()
返回true如果至少有一個元素將謂詞測試視爲true。但根據我的理解,如果沒有提供謂詞,則使用_.identity()
。但console.log單獨使用_.identity()
這些元素的任何一個都沒有返回true
。那麼它爲什麼會迴歸真實?
沒有謂詞,some
使用identity
,它使用該值本身,'yes'
是truthy。
通過快速跳水the annotated source(特別關注cb
和失蹤謂詞存在的處理)給你留下,本質上來說,當他們做了強迫布爾:
if (predicate(obj[currentKey], currentKey, obj)) return true;
沒有謂語意味着你在那裏使用原始值,所以if ('yes')
,這是真的。
你不是在控制檯中看到true
任何這些值,因爲_.identity
將返回值本身(所以'yes'
),而不是它強迫爲布爾值。如果你要做!!'yes'
(強制和雙重否),你會看到true
。
它並不需要返回字面值true
,它只需要返回一個值truthy(雖然你總是應該只返回布爾值)。
non-empty string 'yes'
is truthy(您可以通過Boolean('yes')
或!!'yes'
測試)。
'yes'
是truthy:
_.some([null]) // false
_.some([0]) // false
_.some(['yes']) // true
_.some([false]) // false
從the Truth, equality in javascript link:
的構建如果(表達式)聲明將迫使使用抽象方法ToBoolean
的量,表達式評估爲布爾的結果ES5規範定義了以下算法:
string
:如果爭論的結果是錯誤的ment是空字符串(它的長度爲零);否則結果是真的。
''yes''是真的。 – zwol