在一个 JS 库中,我看到了这样的语法:
if (val > 5 == t) { ... }
我在控制台中对此进行了测试:
1 == 1 == 2 // false
2 > 1 == 1 // true
1 == 2 == 1 // false
1 == 1 == 1 // true
1 < 2 < 3 // true
1 > 2 > 3 // false
乍一看都没错。这个可以用吗?
在一个 JS 库中,我看到了这样的语法:
if (val > 5 == t) { ... }
我在控制台中对此进行了测试:
1 == 1 == 2 // false
2 > 1 == 1 // true
1 == 2 == 1 // false
1 == 1 == 1 // true
1 < 2 < 3 // true
1 > 2 > 3 // false
乍一看都没错。这个可以用吗?
1 == 1 == 2 // this
true == 2 // becomes this
1 == 2 // which becomes this, and is false
2 > 1 == 1 // this
true == 1 // becomes this
1 == 1 // which becomes this, and is true
...等等。
如果您想知道转换,您应该搜索==
使用Abstract Equality Comparison Algorithm的运算符。
您并没有真正比较您认为要比较的内容:
(1 == 1) == 2 // actually true == 2 which is false
(1 == 2) == 1 // actually false == 1 which is false
这就是为什么严格平等===
在所有情况下都会失败的原因
Javascript 不支持数学中使用的链式比较语法:
1 < 2 < 3 // 1 is less than 2 which is less than 3.
相反,它会从左到右评估每个比较,这有时会产生与数学链式比较相同的结果,就像所有示例一样,但过程不同:
1 < 2 < 3 // "1 is less than 2" is true, true is 1, "1 is less than 3" is true.
// Javascript returns true.
3 < 2 < 1 // "3 is less than 2" is false, false is 0, "0 is less than 1" is true.
// Javascript returns true.
出于这个原因,它应该被劝阻。
但是,要回答您的问题,可以使用它。
这是一种正确的语法,但不是我推荐的。发生了什么,大概是:
if ((val > 5) == t) { ... }
I tested this in console:
(1 == 1) == 2 // false
(2 > 1) == 1 // true
(1 == 2) == 1 // false
(1 == 1) == 1 // true
(1 < 2) < 3 // true
(1 > 2) > 3 // false
左侧的布尔值隐式转换为 int。
没有什么可以阻止您使用这种冒险的语法,但是请记住,JavaScript 代码中出现错误的最常见原因之一是弄乱了运算符优先级。
因此,强烈建议通过将括号添加到优先级组来明确定义优先级,以防它们包含的不仅仅是简单的数学表达式,优先级可明确确定。