今天早上可能我只是非常昏昏沉沉,但我很难理解为什么这会以true
的形式返回:
_.some([null, 0, 'yes', false]); // true
我知道如果至少有一个元素将谓词测试传递为true,_.some()
将返回true。但根据我的理解,如果没有提供谓词,则使用_.identity()
。但是使用_.identity()
单独控制每个元素的console.log并没有为其中任何元素返回true
。那为什么它会回归呢?
答案 0 :(得分:2)
如果没有谓词,some
会使用identity
,它会使用值本身,而'yes'
则是真实的。
快速浏览the annotated source(特别注意cb
以及那里缺少谓词的处理),当他们这样做时,基本上会强制转换为布尔值:
if (predicate(obj[currentKey], currentKey, obj)) return true;
没有谓词意味着你正在使用那里的原始值,所以if ('yes')
,这是真的。
您在控制台中没有看到任何这些值的true
,因为_.identity
将返回值本身(所以'yes'
),而不是将其强制转换为布尔值。如果您要!!'yes'
(强制和双重否),您会看到true
。
答案 1 :(得分:2)
'yes'
是真的:
_.some([null]) // false
_.some([0]) // false
_.some(['yes']) // true
_.some([false]) // false
来自the Truth, equality in javascript link:
构造 if(Expression) Statement将使用抽象方法ToBoolean
强制将Expression的计算结果评估为布尔值,ES5规范定义了以下算法:
string
:如果参数为空String(其长度为零),则结果为false;否则结果是真的。
答案 2 :(得分:1)
它不需要返回文字值true
,它只需要返回一个真值(尽管你总是 只返回布尔值)。
non-empty string 'yes'
is truthy(您可以Boolean('yes')
或!!'yes'
进行测试。)