[英]Javascript var === 2 && console.log('true'). How does this work?
var test = 2;
test === 2 && console.log('true');
这使我感到困惑。 直到第二天我才看到这个。 此输出在控制台中为true
。
那么,这种魔术如何起作用?
这(错误)使用了JavaScript的布尔值处理; 由于表达式的延迟计算,仅当someVar === 2
先前被评估为true
时,才会运行console.log('true')
。
这种行为称为短路评估 。
顺便说一下,这种类型的编码具有合法的用例。 我最喜欢的是使用配置对象 :
function (options) {
var options = options || {};
}
这样,即使没有将其作为参数提供,options对象也存在。
实际上,此代码无效:
var === 2 && console.log('true')
VM132:2 Uncaught SyntaxError: Unexpected token ===
您可以在浏览器中自行尝试(例如,在Chrome浏览器中查找开发人员工具)。
参见http://jsfiddle.net/jcdxnte0/
编辑:
语法x && y
表示x
和y
必须为真。 这意味着,如果x
为true,则y
将被求值,如果x
为false,则y
将不被求值(因为x
为false,所以两个都永远都不为真,所以为什么要费心计算y
?-评估从左到右进行)。 在您的情况下, x
是test === 2
,而y
是console.log(...)
。
它可以读为
if( test === 2 ){ console.log('true'); }
之所以起作用,是因为(test === 2)
是一个可解析为value的表达式 。
它将解析为true或false。 然后,仅当前面的表达式返回true时,JavaScript才会在&&
之后执行代码。 (因此false && console.log()
将不会记录任何内容)。
滥用它并使其他开发人员感到困惑的另一种有趣方式是,分配也返回一个值,例如
var x = 0, y = 5;
(x = y) && console.log( 'x is now 5' );
在这种情况下(x = y)
不仅将y
的值分配给x
,而且还返回5
,这是正确的,因此console.log
得到评估。 请不要使用这个 。
JavaScript评估左边的部分,如果是,则执行右边的部分。 您可以使用||
进行相反的操作 操作员。
还值得注意的是,如果正确的部分包含赋值,则应将其包裹在括号中:
var foo;
true && (foo = "bar");
虽然完全有效,但我建议不要使用此语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.