为什么javascript更喜欢在任何其他选择中返回String
?
请考虑以下代码段。
var arr = ['Hello1', 'Hello2', 'Hello3'];
Array.prototype.item = function(x) {
return this[x] || null || 'aïe' || 12 || undefined ;
};
console.log( arr.item(43) ); // returns aïe
我故意调用了一个不存在的数组元素。
但我无法理解为什么arr.item(43)
会返回String
?为什么不null
或undefined
甚至12
?
答案 0 :(得分:25)
因为this[x]
是undefined
,这是假的,所以null
。
||
运算符返回它找到的第一个“truthy”值,并在此时停止其评估。
如果未找到“truthy”值,则返回上次评估的操作数的结果。
总共有6个“假”值。他们是......
false
undefined
null
""
NaN
0
Everything else被认为是真实的。
因此,您的表达式将被评估为......
// v--falsey v--truthy! return it!
((((this[x] || null) || 'aïe') || 12) || undefined);
// ^--falsey ^--------^---these are not evaluated at all
或者你可以这样看:
(
(
(
(this[x] || null) // return null
/* (null */ || 'aïe') // return 'aïe' and stop evaluating
|| 12)
|| undefined);
答案 1 :(得分:5)
声明
return this[x] || null || 'aïe' || 12 || undefined ;
将从左到右评估子表达式,并将返回未评估为 false 的第一个子表达式。不存在的元素根据定义评估为 false ,因为它未定义,null
false 。这使得字符串成为第一个非 false 子表达式,这就是你得到的。
答案 2 :(得分:3)
代码a || b
大致相当于a ? a : b
,或者这个稍微冗长的代码:
if (a) {
result = a;
} else {
result = b;
}
由于||
为left-associative,表达式a || b || c
的评估结果为(a || b) || c
。
因此,简单来说,这意味着链接时||
运算符会返回第一个“truthy”操作数,或者是最后一个元素。
当您缺少值时,此功能可用于提供默认值:
var result = f() || g() || defaultValue;
您可以将其读作:获取f()的结果。如果它是一个假值,那么尝试g()。如果这也给出了假值,则使用defaultValue
。
答案 3 :(得分:1)
字符串是or或链中的第一个truthy值。 Simples
答案 4 :(得分:1)
因为它是按从左到右的顺序进行评估。
如果您要修改为:
return this[x] || null || 12 || 'aïe' || undefined ;
你的回答是12。
答案 5 :(得分:0)
return this[x] || null || 'aïe' || 12 || undefined
不会返回其中一个。它应该返回表达式this[x] || null || 'aïe' || 12 || undefined
的结果 - 我相信它将返回一个布尔值。