“(M [key] ||(M [key] = []))。push(elem);”工作?

时间:2015-12-31 17:45:55

标签: javascript

我知道

||

是解决常见问题的常用方法

  

“如果数组存在,则将此元素推送到数组的末尾,如果存在,则将其推送到数组的末尾   不存在,初始化数组,然后推送元素“

但语法如何分解?我就是这样看的:

M[key]的存在意味着该运算符左右两侧的任何内容都被解释为布尔值。因此,(M[key] = [])push要么是布尔语,要么是强制转换为布尔值。在任何一种情况下,我都看不出(M[key] || (M[key] = [])如何apply的值lapply。地狱发生了什么事?

5 个答案:

答案 0 :(得分:3)

这确实是JavaScript中非常常见的模式。

您需要在与密钥关联的列表中添加元素,如果不存在则创建新列表。

要获取与密钥关联的列表,代码为:

M[key]

但如果undefined不存在,则会返回key

Javascript ||(逻辑 - 或)运算符具有非常有用的语义:如果左侧为真,则返回它,否则评估并返回右侧。表达式:

M[key] || (M[key] = [])
因此,

返回与M[key]关联的列表(如果存在),否则将评估部分(M[key] = [])。这是有效的,因为数组(即使是空的)在JavaScript中为真,undefined为假。

赋值运算符=(它是JavaScript中的普通运算符,可以在表达式的中间使用)执行赋值,然后返回刚分配的值。

因此,整个事情只返回与密钥关联的列表,或者如果M中的密钥未知,则创建一个新的空列表。

将元素推送到数组是<array>.push(x),点左边的部分可以是任何表达式。

(M[key] || (M[key] = [])).push(x);

因此会将x添加到左侧表达式返回的列表中。

&#34;扩展版本如下所示:

if (!M[key]) {
    M[key] = [];
}
M[key].push(x);

请注意,在JavaScript中使用对象作为字典需要一些小心,因为继承成员。例如,M = {}key = "constructor"代码会失败。

答案 1 :(得分:0)

||是一个短路运营商。这意味着如果前半部分是“真正的”,那么下半部分永远不会。因此,如果M[key]有一个值(一个真值),那就是使用的值,我们就完成了。否则第二部分就完成了。

写出长篇文章,你可能有:

   if (M[key]) M[key].push(elem);
   else {
       M[key] = [];
       M[key].push(elem);
   }

所以你可以看到为什么会出现较短的成语。

答案 2 :(得分:0)

使用您的操作订单!遵循括号。

(M[key] || (M[key] = [])).push(elem);

分解。 (M[key] || (M[key] = []))

||是OR运算符。因此,如果存在M[key],则push为其新元素。如果没有,请创建阵列并添加它。

它评估了一个真实的比较。 (是或否)

答案 3 :(得分:0)

好的,这里有很多事情要发生。

首先,数组如何在javascript中工作。您可以使用ARRAY_NAME [KEY_VALUE]访问或分配数组元素。

因此,如果对象存在,M [Key]将返回该对象。

基于此代码,M是数组数组。因此,当M [Key]评估时,它将返回一个数组或null。

当表达式为||时b在javascript中被评估它被短路并且也从左到右被评估 - 即如果a是真,则b从不被评估 - 如果a是假则则评估b。 (这在很多C语言中很常见。

由于M [Key]将返回对象,如果它存在于||之后的部分永远不会被评估,并且该键上的数组用于推送新元素。

如果M [Key]上不存在,则评估b部分,并且在这种情况下b部分首先将空数组([])分配给M [Key]处的位置(正如我们在M之前所述) [Key]也可以用于赋值)然后使用这个新的空数组(因为它是评估()内的表达式的结果)来推送新元素。

https://en.wikipedia.org/wiki/Short-circuit_evaluation

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

答案 4 :(得分:0)

我通过以下方式了解: 在javascript中未定义,因为布尔值为false。

(M[key] || (M[key] = [])).push(elem);

按以下方式执行:如果M [key]未定义 - false,则表达式的结果为M [key]。

如果M [key]未定义 - false,则执行boolean || -OR运算符的第二部分,M [key]将空数组作为值。表达式的结果是M [key],但现在它将空数组作为值。

然后我们将新值推入M [key]数组:M [key] .push(elem);

我认为这很有用javascript-operators-and-truthy-falsy