这个JS语法是什么?表达中的作业? (x!= null&&(y = x))

时间:2012-03-15 19:10:53

标签: javascript syntax conditional

我正在使用这个JS插件,我遇到了一些我以前从未见过的语法。我理解它在做什么,但我不确定它为什么会起作用。

以下是其中一个实例的示例:

settings.maxId != null && (params.max_id = settings.maxId);

这只是利用条件而单=?这是JS的常用语法吗?

3 个答案:

答案 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}}声明。