cha*_*tsm 332 javascript variables variable-assignment or-operator
给出这段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
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释一下这种技术的用途(我最好的猜测是在这个问题的标题中!)?它是如何/为什么它正常工作?
我的理解是变量f将被赋予第一个变量的最近值(从左到右),该变量的值不是null或未定义,但是我没有设法找到关于这种技术的很多参考资料并且有看到它用了很多.
此外,这种技术是否特定于JavaScript?我知道在PHP中做类似的事情会导致产生f一个真正的布尔值,而不是d它自身的值.
unw*_*ind 202
有关说明,请参见短路评估.这是实现这些运营商的常用方式; 它不是JavaScript独有的.
CMS*_*CMS 181
如果变量是假的,则用于指定默认值,在这种情况下为值.yx
JavaScript中的布尔运算符可以返回操作数,而不像其他语言那样总是布尔结果.
Logical OR运算符(||)返回其第二个操作数的值,如果第一个操作数是假的,否则返回第一个操作数的值.
例如:
"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"
Run Code Online (Sandbox Code Playgroud)
Falsy值是谁强迫要false在布尔上下文中使用时,它们是0,null,undefined,一个空字符串,NaN当然false.
Anu*_*rag 161
Javacript使用短路评价为逻辑运算符||和&&.但是,它与其他语言的不同之处在于它返回停止执行的最后一个值的结果,而不是a true或falsevalue.
JavaScript中的以下值被认为是假的.
"" (空字符串)忽略运算符优先级规则并保持简单,以下示例显示哪个值暂停了评估,并作为结果返回.
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
Run Code Online (Sandbox Code Playgroud)
前5个值NaN是假的,所以它们都是从左到右进行评估,直到它满足第一个truthy值 - "Hello"这使整个表达式成为真,所以任何进一步的东西都不会被评估,并且"Hello"作为表达式的结果返回.同样,在这种情况下:
1 && [] && {} && true && "World" && null && 2010 // null
Run Code Online (Sandbox Code Playgroud)
前5个值都是真实的并且得到评估,直到它满足第一个假值(null),这使得表达式为false,因此2010不再进行求值,并且null作为表达式的结果返回.
您给出的示例是使用JavaScript的此属性来执行赋值.它可以在任何需要在一组值中获得第一个truthy或falsy值的地方使用.下面的代码将赋值"Hello",b因为它可以更容易地分配默认值,而不是if-else检查.
var a = false;
var b = a || "Hello";
Run Code Online (Sandbox Code Playgroud)
您可以将下面的示例称为利用此功能,我相信它会使代码更难阅读.
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
Run Code Online (Sandbox Code Playgroud)
在警报内,我们检查是否messages是假的,如果是,则评估并返回noNewMessagesText,否则评估并返回newMessagesText.由于在这个例子中它是假的,我们停在noNewMessagesText并发出警报"Sorry, you have no new messages.".
Als*_*nde 48
Javascript变量没有输入,因此f可以分配一个整数值,即使它是通过布尔运算符赋值的.
f被赋予最接近的值,该值不等于false.所以0,false,null,undefined都被传递:
alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
Run Code Online (Sandbox Code Playgroud)
Mar*_*cin 29
它没有任何魔力.像a || b || c || d懒惰计算的布尔表达式.Interpeter查找值a,它是未定义的,所以它是假的,所以它继续前进,然后它看到b哪个是null,它仍然给出错误的结果,所以它继续前进,然后它看到c- 相同的故事.最后它看到d并说'嗯,它不是空的,所以我有我的结果'并且它将它分配给最终变量.
这个技巧适用于对布尔表达式进行惰性短路评估的所有动态语言.在静态语言中,它不会编译(类型错误).在急于评估布尔表达式的语言中,它将返回逻辑值(在这种情况下为true).
这个问题已经收到了好几个答案.
总之,这种技术正在利用语言编译的特性.也就是说,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
Run Code Online (Sandbox Code Playgroud)
返回输出第一个真值.
如果都是false则返回最后一个false值.
例:-
null || undefined || false || 0 || 'apple' // Return apple
Run Code Online (Sandbox Code Playgroud)
小智 5
其称为短路运算符。
短路求值表示,仅当第一个参数不足以确定表达式的值时才执行或求值第二个参数。当 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`
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
323484 次 |
| 最近记录: |