javascript - "(M[key] || (M[key] = [])).push(elem); "是如何工作的?

标签 javascript

我知道

(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"

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

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

最佳答案

这确实是 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到左侧表达式返回的列表。

“扩展版看起来像这样:

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

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

关于javascript - "(M[key] || (M[key] = [])).push(elem); "是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34549865/

相关文章:

javascript - 如何在 JavaScript 中创建计数生成器/迭代器级联?

javascript - 通过 HTML/CSS/JavaScript 实现 5 种可能的颜色?

javascript - 如何在运行时为组件选择 Angular 2 服务

javascript - 添加动态元素,并在单独的函数中设置它们的宽度/高度

java - 从 Google 应用引擎提供 dart Web 应用程序

javascript - 使用 Javascript 将动画 GIF 分享到 Facebook

javascript - 为什么有时显示图像有时不显示图像?

javascript - Webpack 导入,default.a 不是构造函数

javascript - Div 不包含在单元格中

javascript - 使用 if 语句删除 Leaflet 弹出窗口中的 "null"属性