Javascript var === 2 && console.log('true')。这是如何运作的?

Javascript var === 2 && console.log('true'). How does this work?

var test = 2;

test === 2 && console.log('true');

这让我很困惑。直到前几天我才看到这个。其输出将是 true 在控制台中。

那么这个魔法是如何工作的呢?

实际上,此代码无效:

var === 2 && console.log('true')
   VM132:2 Uncaught SyntaxError: Unexpected token ===

您可以在浏览器中自行尝试(即在 Chrome 中查找开发人员工具)。

http://jsfiddle.net/jcdxnte0/


编辑:

语法 x && y 意味着 xy 都需要为真。这意味着,如果 x 为真,y 将被评估,如果 x 为假,y 将不会被评估(因为 x 为假,所以 both 永远不会为真,所以为什么要费心评估 y? - 评估从左到右)。在您的情况下,xtest === 2yconsole.log(...)

这(误)使用了 JavaScript 的布尔处理;由于表达式的惰性评估, console.log('true') 只是 运行,而 someVar === 2 之前被评估为 true

此行为称为 Short-circuit evaluation

其他用例

顺便说一句,这种类型的编码有合法的用例。我最喜欢的是使用配置对象:

function (options) {
    var options = options || {};
}

这样,选项对象即使没有作为参数也存在。

JavaScript 评估左侧部分,如果为真,则执行右侧部分。您可以使用 || 运算符执行相反的操作。

同样值得注意的是,如果它包含一个赋值,则正确的部分应该用括号括起来:

var foo;   
true && (foo = "bar");

虽然它完全有效,但我建议不要使用这种语法。

可以读作

if( test === 2 ){ console.log('true'); }

之所以有效,是因为 (test === 2) 是一个 表达式 ,它 解析为一个值
它会解析为 true 或 false。 JavaScript 将在 && 之后仅当前面的表达式返回 true 时执行代码。 (所以 false && console.log() 不会记录任何内容)。

另一种滥用它并混淆其他开发人员的有趣方式是赋值也是 returns 一个值,例如

var x = 0, y = 5;
(x = y) && console.log( 'x is now 5' );

在这种情况下 (x = y) 不仅将 y 的值赋给 x,而且 returns 5 也为真值,因此 console.log 得到评估。 请不要使用这个