我正在使用这个JS插件,但遇到了一些我从未见过的语法。我知道它在做什么,但不确定它为什么有效。
下面是一个实例:
settings.maxId != null && (params.max_id = settings.maxId);
这只是利用条件语句和单个=吗?这是JS常见的语法吗?
我正在使用这个JS插件,但遇到了一些我从未见过的语法。我知道它在做什么,但不确定它为什么有效。
下面是一个实例:
settings.maxId != null && (params.max_id = settings.maxId);
=
运算符是一个表达式,它会评估分配的值。由于它是一个表达式,因此它可以在允许表达式的任何地方使用,即使它会导致副作用。
因此:settings.maxId != null && (params.max_id = settings.maxId)
settings.maxId
不为null,则(只有这种情况,因为&&
会短路)计算右表达式(params.max_id = settings.maxId
),这将导致settings.maxId
的值被分配给params.max_id
。
这样写更加清晰易懂:if (settings.maxId != null) {
params.max_id = settings.maxId
}
愉快的编程。
&&
运算符被称为“布尔AND
”运算符。通常,您会在if
语句中看到它:
if (x == true && y == false) {
但这并不是一种限制。您可以在任何有效的表达式中使用它,将其操作数的布尔值“组合”成单个布尔结果,根据逻辑“AND”操作:
var z = (x == true && y == false);
// z is now true or false, accordingly
&&
的一个优点是它可以进行“短路”。在表达式 false && true
中,由于第一个操作数为 false
,整个表达式只能求值为 false
,因此第二个操作数甚至都不会被求值。var z = (false && foo());
// z is now false
foo
甚至没有被调用!它不需要被调用,程序就知道z
将会是false
。这不仅仅是一种优化——你可以依靠它。一些愚蠢的人使用这种技术重写条件语句:if (x == 0) {
foo();
}
将难以阅读的单个表达式转换成易于阅读的形式:
(x == 0) && foo();
现在,考虑分配可以像函数调用一样是一个表达式:
var a = (b = c);
或者:
var a = (b = foo());
var a = ((x == 0) && (b = foo()));
如果 x
不等于 0
,那么整个表达式 b = foo()
就不会被求值,因为发生了短路。
我们甚至不需要对 &&
操作的结果进行任何操作,如果我们不将它存储到 a
中,你只需要这样写:
(x == 0) && (b = foo());
x
等于0
时才会将b
赋值为foo()
的返回值。请避免使用此语句,因为它很难阅读,可以使用if
语句代替。settings.maxId != null
时才会赋值给params.max_id = settings.maxId
,因为&&
是一种短路逻辑运算符。AND
,则没有必要进一步检查。