我正在使用这个JS插件,我遇到了一些我以前从未见过的语法。我理解它在做什么,但我不确定它为什么会起作用。
以下是其中一个实例的示例:
settings.maxId != null && (params.max_id = settings.maxId);
这只是利用条件而单=?这是JS的常用语法吗?
答案 0 :(得分:14)
在JavaScript中,=
运算符是表达式,并评估指定的值。因为它是一个表达式,所以它可以在任何允许表达式的地方使用,即使它会导致副作用。
因此:
settings.maxId != null && (params.max_id = settings.maxId)
意味着:如果settings.maxId
不为null,那么(且只有,因为&&
为short circuiting)才会评估右表达式({{1} })反过来导致params.max_id = settings.maxId
的值被分配给settings.maxId
。
这更清楚地写成:
params.max_id
快乐的编码。
答案 1 :(得分:3)
由于params.max_id = settings.maxId
是短路逻辑运算符
settings.maxId != null
时分配&&
这种行为是由于javascript会在必要时评估条件。因此,如果第一个条件为假而第二个条件为AND
,则无需进一步检查
答案 2 :(得分:3)
&&
运算符称为" boolean 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()));
现在,如果b = foo()
不是x
,由于短路,整个表达式0
都不会被评估。
我们甚至不需要对&&
操作的结果做任何事情,如果我们不将其存储到a
,您只需要离开(x == 0) && (b = foo());
:
b
这是一个声明,仅当foo()
为x
时才会将0
分配给if
的值。
避免它。这很难读。只需使用{{1}}声明。