JavaScript OR(||)变量赋值说明
给出这段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本身的值。
12个解决方案
179 votes
有关说明,请参见短路评估。 这是实现这些运营商的常用方式; 它不是JavaScript独有的。
unwind answered 2019-02-13T16:32:17Z
154 votes
如果0变量是假的,则用于指定默认值,在本例中为false。
JavaScript中的布尔运算符可以返回操作数,而不像其他语言那样总是布尔结果。
Logical OR运算符(false)返回其第二个操作数的值,如果第一个操作数是假的,则返回第一个操作数的值。
例如:
"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"
假值是那些在布尔上下文中使用时强制转向false的值,它们是0,null,undefined,空字符串,NaN,当然还有false。
CMS answered 2019-02-13T16:33:07Z
109 votes
Javacript对逻辑运算符messages和noNewMessagesText使用短路评估。但是,它与其他语言的不同之处在于它返回停止执行的最后一个值的结果,而不是messages或noNewMessagesText值。
JavaScript中的以下值被认为是假的。
假
空值
messages(空字符串)
0
楠
未定义
忽略运算符优先级规则并保持简单,以下示例显示哪个值暂停了评估,并作为结果返回。
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
前5个值高达messages是假的,所以它们都是从左到右进行评估,直到它满足第一个真实值 - noNewMessagesText,这使得整个表达式为真,所以不会评估任何进一步的结果,并且结果返回newMessagesText 的表达。 同样,在这种情况下:
1 && [] && {} && true && "World" && null && 2010 // null
前5个值都是真实的并且得到评估,直到它满足使表达式为假的第一个假值(messages),因此不再评估noNewMessagesText,并且由于表达式而返回newMessagesText。
您给出的示例是使用JavaScript的此属性来执行赋值。 它可以在任何需要在一组值中获得第一个truthy或falsy值的地方使用。 下面的代码将值messages分配给noNewMessagesText,因为它可以更容易地分配默认值,而不是执行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."。
Anurag answered 2019-02-13T16:34:55Z
42 votes
Javascript变量没有输入,因此f可以分配一个整数值,即使它是通过布尔运算符赋值的。
f被赋予最接近的值,该值不等于false。 所以0,false,null,undefined都被传递:
alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
Alsciende answered 2019-02-13T16:35:32Z
30 votes
它没有任何魔力。 像a || b || c || d这样的布尔表达式被懒惰地评估。 Interpeter查找a的值,它是未定义的所以它是假的所以它继续前进,然后它看到b这是null,它仍然给出错误的结果所以它继续前进,然后它看到c - 相同的故事。 最后它看到了d并且说'嗯,它不是空的,所以我有我的结果'并且它将它分配给最终变量。
这个技巧适用于对布尔表达式进行惰性短路评估的所有动态语言。 在静态语言中,它不会编译(类型错误)。 在急于评估布尔表达式的语言中,它将返回逻辑值(在这种情况下为true)。
Marcin answered 2019-02-13T16:36:11Z
9 votes
这个问题已经收到了好几个答案。
总之,这种技术正在利用语言编译的特性。 也就是说,JavaScript将布尔运算符的评估“短路”,并返回与第一个非假变量值或最后一个变量包含的值相关联的值。 请参阅Anurag对那些将评估为false的值的解释。
由于几个原因,使用这种技术并不是一种好的做法 然而。
代码可读性:这是使用布尔运算符,如果不理解此编译的行为,则预期结果将是布尔值。
稳定性:这是使用语言编译方式的特性,这种特性在多种语言中是不一致的,因此,它可能会成为未来变化的目标。
记录的功能:现有的替代方案可满足此需求,并且在更多语言中保持一致。 这将是三元运算符:
()? 值1:值2。
使用三元运算符确实需要更多的输入,但它清楚地区分了被评估的布尔表达式和被分配的值。 此外,它可以链接,因此可以重新创建上面执行的默认分配类型。
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
var f = ( a ) ? a :
( b ) ? b :
( c ) ? c :
( d ) ? d :
e;
alert(f); // 4
WSimpson answered 2019-02-13T16:37:31Z
5 votes
返回输出第一个真值。
如果都是false则返回最后一个false值。
例:-
null || undefined || false || 0 || 'apple' // Return apple
Arshid KV answered 2019-02-13T16:38:11Z
4 votes
它将新变量(z)设置为值2214911230474912769,如果它是“truthy”(非零,有效对象/数组/函数/无论是什么)或y否则。 在x不存在的情况下,这是提供默认值的相对常见方式。
例如,如果你有一个带有可选回调参数的函数,你可以提供一个不执行任何操作的默认回调:
function doSomething(data, callback) {
callback = callback || function() {};
// do stuff with data
callback(); // callback will always exist
}
Matthew Crumley answered 2019-02-13T16:38:49Z
1 votes
这意味着如果设置了false,则z的值将为x,否则如果设置为y,则其值将设置为z的值。
它是一样的
if(x)
z = x;
else
z = y;
这是可能的,因为JavaScript中的逻辑运算符不返回布尔值,而是返回完成操作所需的最后一个元素的值(在OR语句中它将是第一个非假值,在AND语句中它将是最后一个)。 如果操作失败,则返回false。
Andris answered 2019-02-13T16:39:36Z
1 votes
它叫做短路运营商。
短路评估表示,仅当第一个参数不足以确定表达式的值时,才会执行或计算第二个参数。 当OR(||)函数的第一个参数求值为true时,总值必须为true。
它也可以用来设置函数参数的默认值
function theSameOldFoo(name){
name = name || 'Bar' ;
console.log("My best friend's name is " + name);
}
theSameOldFoo(); // My best friend's name is Bar
theSameOldFoo('Bhaskar'); // My best friend's name is Bhaskar`
Vijay answered 2019-02-13T16:40:22Z
0 votes
它将评估X,如果X不为空,则为空字符串,或0(逻辑假),然后将其分配给z。 如果X为空,即空字符串,或0(逻辑假),则它将y指定给z。
var x = '';
var y = 'bob';
var z = x || y;
alert(z);
输出'bob';
tvanfosson answered 2019-02-13T16:41:03Z
0 votes
根据Bill Higgins的博客文章; Javascript逻辑OR赋值习惯用法(2007年2月),从v1.2开始,这种行为是正确的(至少)
他还建议另一种用途(引用):“跨浏览器差异的轻量级规范化”
// determine upon which element a Javascript event (e) occurred
var target = /*w3c*/ e.target || /*IE*/ e.srcElement;
Alon Brontman answered 2019-02-13T16:41:43Z