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 は、またはまたは任意のオブジェクトのように、真であると評価される最初のオペランドを返すか、最後の値を返します。(したがって、すべての値が false の場合に返されます)。1truea || b || cc

あなたの例では、これがあります:

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

Javascript は、左側の を評価することから始めnodesByName[name]ます。この値が真実であれば、それが返されます。そうでない場合 (およびそうでない場合undefined)、右側が評価されて返されます。右辺は代入で{name: name}、 に代入した後にオブジェクト を返しますnodesByName[name]

このコードのチャンクを使用する理由は、nodesByName[name]まだ値がない場合に値を割り当てるためです。

于 2014-08-19T18:22:22.243 に答える
1

割り当てを返すのではなく、割り当ての戻り値を返します。の戻り値の詳細については、http://www.quirksmode.org/blog/archives/2008/01/using_the_assig.htmlを参照してください=。この場合、nodesByName[name]が定義されていない場合、関数は戻ります(すべてのオブジェクトがそうであるため、{name: name}これは に評価されます)。true

于 2014-08-19T18:00:22.763 に答える
0

上記のコードは、nodesByName オブジェクトが常に定義されている場合にのみ機能します。

わからないことの説明は次のとおりです。

{name: 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 に答える