我在某处看到了这段代码:
var idx = SOME_VALUE;
var color = {
yellor: 1,
red: 2,
black: 0
};
var x = color[idx] || []; // Is this means if color[idx] is null, then return an empty array?
我只能猜测代码var x = color[idx] || [];
表示如果color[idx]
为空,则将空数组返回x,否则x = color [idx]。我是对的吗?
不过,我需要一个解释。此代码是否具有与以下相同的逻辑?
CONDITION==VALUE? TRUE_goes_here : FALSE_goes_here
答案 0 :(得分:4)
这意味着如果color[idx]
是“假的”,则使用空数组。 “Falsy”值为false
(当然),0
,NaN
,""
,undefined
和null
(所有其他值均为“truthy”)。这个成语是JavaScript curiously powerful ||
operator *。
在这种情况下,如果color
不包含idx
所包含的名称的属性,则它会提供默认值(因为当您索引像这样的对象而密钥不是匹配任何现有的属性名称,结果为undefined
):x
将为1
(如果idx
为“yellor”),2
(如果{{ 1}}是“红色”),idx
(如果0
是“黑色”),或idx
如果[]
是其他任何内容。
所以在问题的最后回答你的问题,基本上是的。它是:
idx
或
var x = color[idx];
if (!x) {
x = [];
}
* (这是我贫血的小博客上的帖子。)
答案 1 :(得分:1)
你是对的。
在Javascript中,a || b
评估第一个“truthy”操作数
如果a
为“falsy”(例如null
,false
,undefined
,0
),则评估为b
。
答案 2 :(得分:0)
或运算符||
会为您提供第一个未评估为conditionall false
的值(如0
或null
)。
这意味着使用0 || null || 5
会产生5个结果。
您在该代码中拥有的是JavaScript中的常见做法,它使用||
运算符在变量初始化时指定默认值。那只是因为
var x = something || default_value;
比
更具可读性var x = (something ? something : default_value);
答案 3 :(得分:0)
var x = color[idx] || [];
如果color
是具有名称为String(idx)
的属性并且该属性的值为真实的对象,请将该属性的值指定给x
。否则,让x
为空数组。
答案 4 :(得分:0)
在这种情况下,||
是“布尔值”或“运算符”。与许多语言一样,JavaScript中的布尔运算符也是短路的。例如,假设我有以下布尔表达式:
var booleanValue = someFunction() || otherFunction()
如果返回的第一个函数值为true-equivalent,则无需计算第二个值,并且otherFunction()
将不会被执行,因为“or”运算符返回一个真等效值,无论是否为某些值操作是真实等效的。这很好,因为它使您的代码更有效:只评估所需的表达式。
此外,在这种情况下有一种奇怪的行为:由于表达式的第一个值是真等效的,因此JavaScript只返回它作为表达式的结果,因为这意味着整个表达式无论如何都是真的。
在您的代码中,color[idx]
的值如果已设置则为true-equivvalent。由于它在“或”运算中是真等效值,因此它将作为表达式的值返回。但是,如果未设置,则返回undefined
,这是一个错误等效值。所以JavaScript必须评估下一个值来定义“或”表达式是否为真。由于下一个值是最后一个值,并且表达式的值完全取决于它,如果第一个值是假等价的,表达式将返回下一个值。