javascript – “(M [key] ||(M [key] = [])).push(elem); “工作?

前端之家收集整理的这篇文章主要介绍了javascript – “(M [key] ||(M [key] = [])).push(elem); “工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我知道

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

解决常见问题的常用方法

“Push this element to the end of array if the array exists,and if it
doesn’t exist,initialize the array and then push the element”

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

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

最佳答案
这确实是JavaScript中非常常见的模式.

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

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

M[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”,代码将失败.

猜你在找的JavaScript相关文章