我知道
(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/