Javascript返回OR还是赋值?

时间:2014-08-19 17:45:45

标签: javascript d3.js return or-operator

我在D3中与simple example合作,我一直对这个回复声明感到困惑。

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

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

我想要了解的是,我不知道如何围绕返回nodesByName[name]={name:name}之类的作业。

4 个答案:

答案 0 :(得分:1)

它没有返回赋值,它返回赋值的返回值。有关=的返回值的详细信息,请参阅http://www.quirksmode.org/blog/archives/2008/01/using_the_assig.html。在这种情况下,当nodesByName[name]未定义时,函数将返回{name: name}(其评估为true,因为所有对象都这样做。)

答案 1 :(得分:1)

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

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

c

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

拥有此代码块的原因是,如果值尚未包含值,则为nodesByName[name]分配值。

答案 2 :(得分:0)

只有始终定义了nodesByName对象时,上面的代码才有效!

以下是您不理解的解释:

{name: name}

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

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

创建此对象后,会将其分配给传递名称参数为name的属性下的对象nodesByName。

答案 3 :(得分:0)

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

  • nodesByName是否已拥有名称为name的媒体资源?然后归还
  • 创建一个对象,仅使用属性name并将其设置为参数
  • 中的给定值
  • 将对象指定为具有nodesByName对象的名称的属性
  • 哦,当你完成那件事的时候也会返回

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

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

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

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

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