需要澄清理解_.some()

时间:2016-03-30 17:10:45

标签: javascript underscore.js

今天早上可能我只是非常昏昏沉沉,但我很难理解为什么这会以true的形式返回:

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

我知道如果至少有一个元素将谓词测试传递为true,_.some()将返回true。但根据我的理解,如果没有提供谓词,则使用_.identity()。但是使用_.identity()单独控制每个元素的console.log并没有为其中任何元素返回true。那为什么它会回归呢?

3 个答案:

答案 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'进行测试。)