JavaScript表达式和语法解释中的多个赋值

时间:2017-03-23 15:23:11

标签: javascript d3.js

以下代码来自Mike Bostock的Force-Directed Graph with Mouseover。对不起,我不能问一个关于这段代码的更尖锐的问题,但我想知道是否有人可以解释forEach块中的语法来计算链接中的不同节点。

下面一行中究竟发生了什么以及分配给哪些变量?是否有在同一表达式中执行多个赋值的名称?

link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});

var links = [
  {source: "Ericsson", target: "ZTE", type: "suit"},
  {source: "Kodak", target: "Samsung", type: "resolved"},
  {source: "Apple", target: "Samsung", type: "suit"},
  {source: "Kodak", target: "RIM", type: "suit"},
  {source: "Nokia", target: "Qualcomm", type: "suit"}
];

var nodes = {};

// Compute the distinct nodes from the links.
links.forEach(function(link) {
  link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});
  link.target = nodes[link.target] || (nodes[link.target] = {name: link.target});
});

1 个答案:

答案 0 :(得分:2)

在这一行中实际上有相当数量的解包:

link.source = nodes[link.source] || (nodes[link.source] = {name: link.source});

首先应该提到x = y || z与此相同*:

if (y)
    x = y;
else
    x = z;

还应注意i = (j = k)表示我们要将k分配给j,然后将该值也分配给i。最后,ijk都具有相同的值。

所以在这种情况下,我们真的得到了这个:

if (nodes[link.source]) {
    link.source = nodes[link.source];
} else {
    nodes[link.source] = { name: link.source };
    link.source = nodes[link.source];
}

也就是说,如果nodes[link.source]是真实的(不是0,null,未定义,空字符串),则link.source将被指定为nodes[link.source]作为值。

如果它是假的,那么link.sourcenodes[link.source]都将被指定为{name: link.source}作为其价值。

*这些是等价的,因为当您评估||时,如果左侧是真实的,则无需评估右侧 - 您已经可以将该语句评估为真。因此,在JavaScript中,如果y是真实的话,它会“返回”y,如果z是假的y但是z是真的,那么falsepsutil如果两者都是假的。