0

Javascript で記述されたコードを理解しようとしていますが、構文ではなく行き詰まっています。

var connections = {}; // I know '{}' means new Object()
var messages = {};

オブジェクトには変数パス、バージョンなどが含まれていますが、コードでは次の行は何をしますか?

connections[ path ] = connections[ path ] || [];
messages[ path ] = messages[ path ] || { version: 0, body: ''};
4

7 に答える 7

4

connectionsmessagesはオブジェクトであるため、と[]配列インデックスを表すのではなく、変数を使用して変数の名前を見つけるメンバーにアクセスするための構文です。

var path = 'x'
connections[path] = connections[path] || [];

上記path = 'x'は等しいので、

connections.x = connections.x || [];

の値によって名前が付けられた 2 つのオブジェクトのメンバーがpath存在する場合は、それを保持し (現在の値をそれ自体に割り当てます)、そうでない場合は (||ここでは結合に使用されます)、新しい空の配列または new{ version: 0, body: '' }をそれぞれ作成します。

合体/論理ORは、左から右に簡単に連鎖できることに注意してください。たとえば、場合によっては次のようなことをしたいかもしれません:

function createItem(color) {

   // if a color is specified in the arguments, use that
   // otherwise, if a color is specified in the settings object for this instance
   // of the current user control, use that. otherwise, fall back to the global
   // default values. if none of these settings have been defined, use black.

   color = color || instanceSettings.defaultColor 
                 || globalSettings.defaultColor
                 || '#000000';

   ...

}
于 2011-12-20T08:15:52.700 に答える
2

基本的に、以前に初期化されていない場合、または null または false または 0 が含まれている場合は、path プロパティを初期化します。

言い換えれば(または他のコード):

if (connections[path] === null || connections[path] === undefined || connections[path] === 0 || connections[path] === false) {
    connections[path] = [];
} else {
    connections[path] = connections[path];
}

messages[path] についても同じですが、空の配列ではなく、何らかのオブジェクトで初期化するだけです。

于 2011-12-20T08:14:53.343 に答える
1

重要なのは、論理 OR ( ||) 演算子を理解することです。JavaScript では、演算子の左側の式が最初にテストされます。true に解決される場合、その式が返されます。false に解決される場合、右側の式が返されます。これは、変数にデフォルト値を割り当てる優れた方法です。

次に、connections[path]配列の要素にアクセスしていません。pathが文字列に解決される場合connections[path]は と同等であり、オブジェクトconnections.pathのそのメンバーにアクセスしているだけです。connections

connections[path] = connections[path] || [];

このコードを書いている人は、パス メンバーを空の配列にすることを望んでいました。この行は本質的に true かどうかをチェックしてconnections[path]ます。そのメンバーに何かがある場合、それは放っておかれます。そうでない場合は、空の配列になります。path

messages[path] = messages[path] || { version: 0, body: '' };

これは、デフォルト値が空の配列ではなく、2 つのメンバーを持つオブジェクトであることを除いて、前の行と同じように機能します。

于 2011-12-20T08:26:01.173 に答える
0

たとえば、以下のように接続とメッセージをオブジェクトとします。

var connections={
  "path":"http://www.xyz.com",
  "version":"1.2.0"
};
var messages={ 
     "text':"This is message",
     "path":"http://www.xyz.com",
     "version":'1.2.0',
     "body":""
 };

これで、以下のコードは次のように機能します。1.pathは、上記のオブジェクトに存在しない場合、空白の文字列が割り当てられます。2.同様に、メッセージのパスはオブジェクト「パス」に存在するパスになります。それ以外の場合は、「バージョン」と「ボディ」のオブジェクトになります

connections[ path ] = connections[ path ] || [];
messages[ path ] = messages[ path ] || { version: 0, body: ''};

接続とメッセージは、javascriptオブジェクトの単なるJSON表現です。したがって、connections[path]はconnections.pathと同じです。サイン|| オブジェクトに実際の値が存在しないか、未定義の場合に空白の値を割り当てるために使用されます。

于 2011-12-20T08:20:51.203 に答える
0

私はあなたの想像力を刺激する必要があります

a || bは、偽の値を含まない最初の要素を返します。

connections[ path ] || []; 
//  return [] ( empty array) if connections[ path ] is return false ( or undefined, 0, [], "", NaN etc)
于 2011-12-20T08:23:00.073 に答える
0
connections[ path ] = connections[ path ] || [];

大まかに翻訳すると

connections[ path ] = connections[ path ] != null ? connections[ path] : [];

この場合、これはデフォルト値を設定する便利な方法ですconnections[path](つまり、[]値がまだ設定されていない場合に値を設定します) 。

一部の言語 (Ruby など) では、これはさらに短く記述できます。

connections[path] ||= []
于 2011-12-20T08:13:13.917 に答える
0

||演算子は OR を意味します。connections[ path ] = connections[ path ] || [];

connections[ path ] === nullifまたは ifを確認するためのチェックを実行しています。この場合は、空の配列connections[ path ] === undefinedに代入します。connections[ path ]

同じチェックをmessages[ path ]実行し、それが null または未定義の場合は、値を割り当てます{ version: 0, body: ''}

于 2011-12-20T08:18:17.533 に答える