【发布时间】:2015-12-04 19:00:49
【问题描述】:
我正在阅读第三方 javascript 库的代码,它有以下行:
x2 = x1 - minWidth * (x2 < x1 || -1);
x1、x2、minWidth都是数字
我想知道(x2 < x1 || -1) 部分。比较运算符在这里是如何工作的?
【问题讨论】:
标签: javascript comparison operators
我正在阅读第三方 javascript 库的代码,它有以下行:
x2 = x1 - minWidth * (x2 < x1 || -1);
x1、x2、minWidth都是数字
我想知道(x2 < x1 || -1) 部分。比较运算符在这里是如何工作的?
【问题讨论】:
标签: javascript comparison operators
首先,让我们看看短路。假设你有这样一行
var A = B || C;
如果B 是truthy 值,则A 将设置为B。如果不是,那么A 将等于C。
将其重新应用于您的情况,如果x2 < x1 为真,则该表达式的结果将为true。否则,结果将是-1。
接下来,我们考虑一下 Javascript 中的类型转换是如何工作的。每当您使用给定值进行乘法运算时,该值都会被强制转换为数字。对于true,该号码是1。
最终,它的意思是“如果 x2 >= x1,则翻转最小宽度的符号。”
【讨论】:
在英文中,如果x2 小于x1 则返回true,否则返回-1。 true 转换为 1,因此归结为 minWidth * 1 or -1
数字示例:
minWidth = 5、x1 = 3、x2 = 2。 x2 = 5 * (true OR -1)
减少:x2 = 5*true = x2 = 5*1
所以这是一种产生负值或正值转换的方法。
【讨论】:
该行的详细等价物类似于,
if(x2 < x1){
x2 = x1 - minWidth * 1;
} else {
x2 = x1 - minwidth * -1;
}
在 JavaScript 中,true 也等于 1。知道了这一点,您可以使用该值来简化某些逻辑。
此外,||二元运算符将在到达true 时继续。条件语句中符合 true 的所有内容都将被忽略。这称为短路。
这就是您的示例中发生的情况。由于该部分条件为真时的值也等于1,所以作者省了一步,直接使用了那个值。
【讨论】: