Javascript返回OR赋值



我在D3中使用一个简单的例子,我一直在困惑这个返回语句一段时间。

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

我对在返回语句中使用||运算符有一个基本的了解,但如果我错了,请纠正我。从我收集到的信息来看,如果nodesByNames[name]未定义,则创建一个名为name的新对象nodesByName[name]

我想知道的是,我不知道如何把我的头脑围绕返回一个像nodesByName[name]={name:name}的赋值

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

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

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

Javascript将从计算左边的nodesByName[name]开始。如果该值为真,则返回该值。如果不是(undefined不是),则计算并返回右侧。右边是赋值操作,赋值给nodesByName[name]后返回一个对象{name: name}

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

它不是返回赋值,而是返回赋值的返回值。有关=返回值的更多信息,请参见http://www.quirksmode.org/blog/archives/2008/01/using_the_assig.html。在本例中,当nodesByName[name]未定义时,该函数将返回{name: name}(其求值为true,因为所有对象都是这样)。

上面的代码只有在始终定义nodesByName对象时才能工作!

下面是你不明白的解释:

{name: name}

实际上创建了一个新对象,并将属性'name'设置为您的name变量的值。

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

一旦这个对象被创建,它被分配给对象nodebyname下的属性与传递的名称参数的name

在您发布的代码中,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;
}

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

相关内容

  • 没有找到相关文章

最新更新