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
意味着 x
和 y
都需要为真。这意味着,如果 x
为真,y
将被评估,如果 x
为假,y
将不会被评估(因为 x
为假,所以 both 永远不会为真,所以为什么要费心评估 y
? - 评估从左到右)。在您的情况下,x
是 test === 2
,y
是 console.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
得到评估。 请不要使用这个。
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
意味着 x
和 y
都需要为真。这意味着,如果 x
为真,y
将被评估,如果 x
为假,y
将不会被评估(因为 x
为假,所以 both 永远不会为真,所以为什么要费心评估 y
? - 评估从左到右)。在您的情况下,x
是 test === 2
,y
是 console.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
得到评估。 请不要使用这个。