我在D3中使用一个简单的例子,我一直在困惑这个返回语句一段时间。
function nodeByName(name) {
return nodesByName[name] || (nodesByName[name] = {name: name});
}
我对在返回语句中使用||
运算符有一个基本的了解,但如果我错了,请纠正我。从我收集到的信息来看,如果nodesByNames[name]
未定义,则创建一个名为name
的新对象nodesByName[name]
。
我想知道的是,我不知道如何把我的头脑围绕返回一个像nodesByName[name]={name:name}
的赋值
当您使用||
操作符创建表达式(即a || b
)时,JavaScript将返回第一个操作数,计算结果为真值,如1
或true
或任何对象,否则将返回最后一个值。(因此,如果所有值都为假,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;
}
基本上做同样的事情,只是使用更多的代码行。