1

我正在使用 D3 中的一个简单示例,并且我一直在为这个 return 语句感到困惑。

function nodeByName(name) {
    return nodesByName[name] || (nodesByName[name] = {name: name});
}

我对||在 return 语句中使用运算符有基本的了解,但如果我错了,请纠正我。根据我收集到的信息,如果nodesByNames[name]未定义,则会nodesByName[name]创建一个名称为name.

我想要解决的是,我不知道如何将我的想法集中在返回一个像nodesByName[name]={name:name}.

4

4 回答 4

1

当您使用||运算符创建表达式(即a || b)时,JavaScript 将返回计算结果为真实值的第一个操作数,例如1true任何对象,否则将返回最后一个值。(如果所有的值都是假的,那么a || b || c将返回)。c

在你的例子中,你有这个:

nodesByName[name] || (nodesByName[name] = {name: name})

Javascript 将从评估左侧开始,nodesByName[name]. 如果这个值是真实的,它将被返回。如果不是,(并且undefined不是),右侧将被评估并返回。右手边是一个赋值,它会{name: name}在赋值给 之后返回一个对象nodesByName[name]

拥有这段代码的原因是nodesByName[name]如果它还没有值,则为其分配一个值。

于 2014-08-19T18:22:22.243 回答
1

它不是返回赋值,而是返回赋值的返回值。有关. _ _ =在这种情况下,当nodesByName[name]未定义时,函数将返回{name: name}(其计算结果为,true因为所有对象都如此)。

于 2014-08-19T18:00:22.763 回答
0

仅当您的 nodesByName 对象始终被定义时,上面的代码才有效!

以下是你不明白的解释:

{name: name}

实际上创建了一个新对象,其属性“名称”设置为您的名称变量的值。

nodesByName[name] = {name: name} or nodesByName[name] = {our new object here}

一旦创建了这个对象,它就会被分配给name传递的 name 参数的属性下的对象 nodesByName。

于 2014-08-19T17:54:05.710 回答
0

在您发布的代码中var nodesByName = {};已经声明了您的对象。所以你的代码基本上是这样阅读的:

  • 是否nodesByName已经具有 name 属性name?然后返回它
  • 创建一个对象,仅具有一个属性name并将其设置为参数中的给定值
  • 将对象作为具有名称的属性分配给 nodesByName 对象
  • 哦,当你完成那个返回值时

所以 return 基本上只返回新创建的对象。

尝试以另一种方式编写代码:

function nodeByName(name) {
  if (nodesByName.hasOwnPropery(name)) {
    return nodesByName[name];
  }

  var newNode = {name: name};
  nodesByName[name] = newNode;
  return newNode;
}

基本上做同样的事情,只是使用更多的代码行。

于 2014-08-19T17:54:16.473 回答