我在D3中与simple example合作,我一直对这个回复声明感到困惑。
function nodeByName(name) {
return nodesByName[name] || (nodesByName[name] = {name: name});
}
我对在return语句中使用||
运算符有基本的了解,但如果我错了,请纠正我。根据我收集的内容,如果未定义nodesByNames[name]
,则会创建名为nodesByName[name]
的新对象name
。
我想要了解的是,我不知道如何围绕返回nodesByName[name]={name:name}
之类的作业。
答案 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
并将其设置为参数所以return基本上只返回新创建的对象。
尝试以另一种方式编写代码:
function nodeByName(name) {
if (nodesByName.hasOwnPropery(name)) {
return nodesByName[name];
}
var newNode = {name: name};
nodesByName[name] = newNode;
return newNode;
}
基本上做同样的事情,只需使用更多行代码。