Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “怎么做?”;(M[键]| |(M[键]=[])。按(元素)&引用;工作_Javascript - Fatal编程技术网

Javascript “怎么做?”;(M[键]| |(M[键]=[])。按(元素)&引用;工作

Javascript “怎么做?”;(M[键]| |(M[键]=[])。按(元素)&引用;工作,javascript,Javascript,我知道 (M[key] || (M[key] = [])).push(elem); 是解决常见问题的常用方法 如果数组存在,并且 不存在,初始化数组,然后推送元素“ 但是语法是如何分解的呢?以下是我的看法: | |的存在意味着该运算符左侧和右侧的任何内容都被解释为布尔值。因此,M[key]和(M[key]=[])都是布尔型或是转换成布尔型的语句。在这两种情况下,我都看不出如何将推到(M[key]| |(M[key]=[])的值上。这到底是怎么回事?这是一个短路运算符。这意味着,如果前半部分是“

我知道

(M[key] || (M[key] = [])).push(elem);
是解决常见问题的常用方法

如果数组存在,并且 不存在,初始化数组,然后推送元素“

但是语法是如何分解的呢?以下是我的看法:


| |
的存在意味着该运算符左侧和右侧的任何内容都被解释为布尔值。因此,
M[key]
(M[key]=[])
都是布尔型或是转换成布尔型的语句。在这两种情况下,我都看不出如何将
推到
(M[key]| |(M[key]=[])
的值上。这到底是怎么回事?

这是一个短路运算符。这意味着,如果前半部分是“真实的”,它就永远不会做下半部分。因此,如果
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]
存在,
将新元素推送到其中。如果不存在,则创建数组并添加它


它的计算结果是一个真实的比较。(正确或否)

好的,这里有很多事情

首先介绍数组在javascript中的工作方式。您可以使用array\u NAME[KEY\u VALUE]访问或分配数组元素

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

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

当表达式a | | b在javascript中求值时,它会短路,也会从左到右求值——也就是说,如果a为真,则不会求值;如果a为假,则会求值(这在许多类似C的语言中很常见)

因为如果对象存在,M[Key]将返回该对象,| |之后的部分永远不会计算,并且该键处的数组用于推送新元素

如果M[Key]处不存在任何内容,则对b部分求值,在这种情况下,b部分首先将空数组(
[]
)分配到M[Key]处的位置(正如我们在前面提到的,M[Key]也可用于赋值),然后使用这个新的空数组(因为它是对
()
中的表达式求值的结果)推动新的元素


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

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

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

M[key]
但如果
键不存在,则返回
undefined

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

M[key] || (M[key] = [])
因此,如果存在,则返回与
M[key]
关联的列表,否则将计算部分
(M[key]=[])
。这是因为数组(即使为空)在JavaScript中为true,而
未定义的
为false

赋值运算符<代码>=/COD>(这是JavaScript中的一个普通运算符,可以在表达式的中间使用)执行赋值,然后返回刚才分配的值。< /P> 因此,如果

M
中的键未知,整个过程只返回与键相关联的列表,或者创建一个新的空列表

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

(M[key] || (M[key] = [])).push(x);
因此,将把
x
添加到左侧表达式返回的列表中

(M[key] || (M[key] = [])).push(x);
“扩展版本”如下所示:

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

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

我理解如下: 在javascript中未定义为布尔值为false

(M[key] || (M[key] = [])).push(elem);
按照以下方式执行:如果M[key]不是未定义的-false,则表达式的结果是M[key]

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

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


我认为这是有用的

如果你打算否决某件事,请有礼貌地对原因进行评论,以便我们能够改进。^同意。如果你不喜欢这个问题,请投票结束,不要出于怨恨而否决正确的材料。@JohnHascall是的,他对我的回答也这样做了。这与
(M[key]=M[key]是一样的push(elem)
意味着如果
M[key]
有一个错误的值,那么它将被初始化为一个空数组,然后,元素
elem
将被附加在数组
M[key]
的末尾,我想你的意思是“有用”confusing@SubparWebDev:不。我实际上认为这个“返回第一个或第二个值”“在许多情况下,对于逻辑and/or,只返回
true
false
是非常有用的。例如在Python中也采用了相同的思想,我认为这通常可以使代码更易于阅读。。。