我知道
||
是解决常见问题的常用方法
“如果数组存在,则将此元素推送到数组的末尾,如果存在,则将其推送到数组的末尾 不存在,初始化数组,然后推送元素“
但语法如何分解?我就是这样看的:
M[key]
的存在意味着该运算符左右两侧的任何内容都被解释为布尔值。因此,(M[key] = [])
和push
要么是布尔语,要么是强制转换为布尔值。在任何一种情况下,我都看不出(M[key] || (M[key] = [])
如何apply
的值lapply
。地狱发生了什么事?
答案 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);