var test = 2;
test === 2 && console.log('true');
这让我很困惑。直到前几天我才看到这个。控制台中的输出为true
。
那么这个魔术是如何运作的?
答案 0 :(得分:4)
这个(mis)使用JavaScript的布尔处理;因为对表达式的懒惰评价,
console.log('true')
仅在someVar === 2
之前评估为true
时运行。
此行为称为Short-circuit evaluation。
顺便说一句,这种类型的编码具有合法的用例。我最喜欢的是使用配置对象:
function (options) {
var options = options || {};
}
这样,即使没有作为参数给出选项对象,也存在选项对象。
答案 1 :(得分:2)
实际上,此代码无效:
var === 2 && console.log('true')
VM132:2 Uncaught SyntaxError: Unexpected token ===
您可以在浏览器中自行尝试(例如,在Chrome中查找开发人员工具)。
请参阅http://jsfiddle.net/jcdxnte0/
编辑:
语法x && y
表示x
和y
都必须为true。这意味着,如果x
为真,则y
将被评估,如果x
为false,则y
将不会被评估(因为x
为false ,所以两者永远不会成真,那么为什么还要评估y
? - 评估从左到右)。在您的情况下,x
为test === 2
,y
为console.log(...)
。
答案 2 :(得分:2)
可以读作
if( test === 2 ){ console.log('true'); }
它有效,因为(test === 2)
是表达式,其中解析为值。
它将解决为真或假。只有当前面的表达式返回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
会被评估。 请不要使用此功能,。
答案 3 :(得分:0)
JavaScript评估左侧部分,如果是,则执行正确的部分。您可以使用||
运算符执行相反的操作。
还值得注意的是,如果右侧部分包含作业,则应将其括在括号中:
var foo;
true && (foo = "bar");
虽然它完全有效,但我建议不要使用此语法。