)变量赋值说明
鉴于这段JavaScript的片段......
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
var f = a || b || c || d || e;
alert(f); // 4
有人可以向我解释这种技术被称为什么(我最好的猜测是在这个问题的标题!)? 以及如何/为什么它的工作原理?
我的理解是,变量f
将被赋予第一个变量的最接近的值(从左到右),该变量的值不是null或未定义,但我没有设法找到关于此技术的很多参考资料,已经看到它用了很多。
此外,这种技术特定于JavaScript? 我知道在PHP中做类似的事情会导致f
有一个真正的布尔值,而不是d
本身的值。
有关解释请参见短路评估。 这是实施这些运营商的常用方式; 它不是JavaScript独有的。
这是为了分配一个默认值,在这种情况下是y
的值,如果x
变量是虚假的。
JavaScript中的布尔运算符可以返回一个操作数,并不总是像其他语言一样的布尔结果。
逻辑OR运算符( ||
)返回第二个操作数的值,如果第一个操作数是虚假的,否则返回第一个操作数的值。
例如:
"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"
Falsy值是那些在布尔上下文中强制为false
值,它们是0
, null
, undefined
,一个空字符串, NaN
,当然也是false
。
Javacript对逻辑运算符||
使用短路评估 和&&
。 但是,与其他语言不同的是,它返回暂停执行的最后一个值的结果,而不是true
值或false
值。
以下值在JavaScript中被认为是虚假的。
""
(空字符串) 忽略运算符优先级规则并简单起见,以下示例显示哪个值暂停评估,并作为结果返回。
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
NaN
的前5个值是虚假的,所以它们都从左到右进行评估,直到它满足第一个真值 - "Hello"
,这使得整个表达式成立,所以更多的东西不会被评估, "Hello"
会得到作为表达的结果返回。 同样,在这种情况下:
1 && [] && {} && true && "World" && null && 2010 // null
前5个值都是真实的,并且被评估,直到它满足使表达式为假的第一个falsy值( null
),所以2010
不再被评估,并且由于表达式返回null
。
你给出的例子是利用这个JavaScript属性来执行任务。 它可用于任何需要在一组数值中获得第一个真值或伪值的地方。 下面的代码将为b
赋值"Hello"
,因为它可以更容易地分配默认值,而不是执行if-else检查。
var a = false;
var b = a || "Hello";
你可以调用下面的例子来利用这个特性,我相信它会让代码更难阅读。
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
在警报内部,我们检查messages
是否是虚假的,如果是,则评估并返回noNewMessagesText
,否则计算并返回newMessagesText
。 由于在这个例子中它是虚假的,我们在noNewMessagesText处停下来并提醒"Sorry, you have no new messages."
。