需要澄清理解 _.some()

Need clarification understanding _.some()

可能是我今天早上很昏昏沉沉,但我很难理解为什么 return 会变成 true:

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

我知道 _.some() return 如果至少有一个元素通过谓词测试为真,则为真。但据我了解,如果没有提供谓词,则使用 _.identity() 。但是 console.log 使用 _.identity() 单独处理每个元素并没有 return true 任何一个。那为什么 return 是真的?

它不需要return字面值true,它只需要return一个真值(虽然你总是应该 return 只有布尔值)。

non-empty string 'yes' is truthy(可以按Boolean('yes')!!'yes'测试)。

没有谓词,some 使用 identity,它使用值本身,而 'yes' 是真实的。

快速浏览 the annotated source(特别注意 cb 和那里缺少的谓词的处理),从本质上讲,当它们这样做时,您会强制转换为布尔值:

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

没有谓词意味着您正在使用那里的原始值,所以 if ('yes'),这是真的。

您没有在控制台中看到任何这些值的 true,因为 _.identity 将 return 值本身(因此 'yes')而不是强制它一个布尔值。如果您要执行 !!'yes'(强制和双重不),您将看到 true.

'yes' 是真的:

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

来自the Truth, equality in javascript link

构造 if ( Expression ) 语句将使用抽象方法 ToBoolean 将表达式的计算结果强制转换为布尔值,ES5 规范为其定义了以下内容算法:

string:如果参数为空字符串(其长度为零),则结果为假;否则结果为真。