繁体   English   中英

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

[英]How does “(M[key] || (M[key] = [])).push(elem); ” work?

我知道

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

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

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

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

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

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

您需要将一个元素添加到与该键关联的列表中,如果不存在,则创建一个新列表。

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

M[key]

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

Javascript || (logical-or)运算符有一个非常有用的语义:如果左侧为true,则返回它,否则计算并返回右侧。 表达方式:

M[key] || (M[key] = [])

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

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

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

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

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

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

“扩展版本看起来像这样:

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

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

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

写出长形式,你可能有:

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

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

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

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

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

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

它评估了一个真实的比较。 (其他是真的)

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

首先,数组如何在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]之前所指出的那样)也用于赋值)然后使用这个新的空数组(因为它是评估()内部表达式的结果来推送新的elem。

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

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

我通过以下方式解释:在javascript中未定义,因为boolean为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM