一行 JavaScript 代码的解释

4
这行JavaScript代码的含义是什么?
var x[],matrix[],n;
...
n = (matrix = x) && matrix.length;

虽然我进行了搜索,但没有找到任何提示。

谢谢


你试过运行它了吗?结果是什么?有什么让你感到惊讶的地方吗? - jonrsharpe
1
matrix = x; n = matrix && matrix.length; - Madhawa Priyashantha
1
@Kosch:使用上述代码,n 最终成为布尔值的概率非常低。x 必须是类似于 {length: true} 这样的东西。 - T.J. Crowder
1
@用户:我没有看到你添加了var x [],matrix [],n;到顶部。那是无效的JavaScript。 - T.J. Crowder
3
@Kosch 中的 0 是假值,但 && 运算符返回的不是布尔值,而是运算后的值。如果你执行 var a = 0 && 1,那么 a 的值就是 0&& 运算符的工作方式是“左侧的值是否为真值 - 如果不是则返回它,如果是则返回右侧的值”。相反地,var a = 0 || 1 则是 a=1,因为 OR 运算符也是以类似的方式工作 - 它会给出值,而不是布尔值。 - VLAZ
显示剩余6条评论
3个回答

8
它会这样做:
  1. x 的值分配给 matrixmatrix = x 表达式的结果是被分配的值(所有分配表达式都是如此)。 让我们称这个值为 "x-value"。从现在开始,我不想再称它为 x,因为 x 只被计算一次。
  2. 如果 x-value 是 真值1(强制为 true),则将 matrix.length 分配给 n;否则,将 x-value 分配给 n
例如,如果 x[],则代码将设置 matrix 指向与 x 相同的空数组,并将 n 设置为 0(分配后的 matrix.length)。 其他示例(我在您编辑问题之前已经编写了这些):如果 x"foo",则将 matrix 设置为 "foo" 并将 n 设置为 3matrixlength)。如果 x""(一个 falsy 值),则将 matrix 设置为 ""并且n 设置为 ""。如果 x{foo:"bar"},则将 matrix 设置为引用相同的对象,并将 n 设置为 undefined(因为该对象没有 length 属性)。你懂的。

上面的 #2 是因为 && 不仅是一个简单的逻辑 AND 运算符。 a && b 的工作方式如下:

  1. 评估 a 以获取其值;让我们称其为 a-value
  2. 如果 a-value 是 falsy,则 && 运算符的结果是 a-value
  3. 否则,计算 b 并将其作为 && 运算符的结果

1 "Truthy" 值是任何不是 "falsy" 的值。 falsy 值是 0nullundefined""NaN,当然还有 false


在讨论JavaScript中的真值/假值时,以下链接是一个有用的参考资源:https://dorey.github.io/JavaScript-Equality-Table/ - VLAZ
@T.J.Crowder 非常感谢您的解释。 - Saman

2
我们可以将其解释为类似于伪代码的形式,如下所示:
var x[],matrix[],n;
...
matrix = x
if(x is not in [null, false, 0, undefined, "NaN",""])
      n = matrix.length
else
      n = x

1

(matrix = x) 是将 x 赋值给变量 matrix 的操作。这里的 x 是一个数组,因此此操作的结果为真值,因此后面的部分会执行。

例如:

var x, matrix = [], n;
n = (matrix = x) && matrix.length;

(matrix = x) 不起作用,因为它是一个假操作。 n 被分配为 undefined(因为这是 x 的值)。


1
"(matrix = x)是一个假操作。n保持为undefined,值得注意的是这是误导性的——n并不是一直保持未定义,它被赋予了undefined的值。这是一个小但重要的区别,因为如果x等于"",那么n之后也将是"",或者如果n有一个值,现在它将变成undefined。赋值改变了值,只是在你特定的例子中,它会将其更改为相同的值。" - VLAZ
正确,@Vld 指出了问题。我的错。如果操作 (matrix = x) 返回一个假值,n 将被赋值为 undefined。我会进行更新。 - Ayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接