Javascript буквенное обозначение для массива объектов - PullRequest
0 голосов
/ 20 декабря 2011

Я пытаюсь понять некоторый код, написанный на Javascript, и я застрял скорее в синтаксисе.

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

объекты содержат переменные path, version и т. Д., Но затем в коде, что делают следующие строки?

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

Ответы [ 7 ]

4 голосов
/ 20 декабря 2011

Поскольку connections и messages являются объектами, [ и ] не обозначают индексы массива, а скорее являются синтаксисом для доступа к членам, где переменная используется для поиска имени переменной.

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

Выше, поскольку path = 'x' равно

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

Говорят, если существует элемент двух объектов, названных значением path, сохраните его(присвойте ему текущее значение), в противном случае (здесь используется || для объединения) создайте новый пустой массив или новый { version: 0, body: '' } соответственно.

Обратите внимание, что объединение / логическое ИЛИ может легкобыть прикованным слева направо.Например, в некоторых случаях вы можете захотеть сделать что-то вроде этого:

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';

   ...

}
2 голосов
/ 20 декабря 2011

По сути, оно инициализирует свойство пути, если оно не было инициализировано ранее или содержит ноль, ложь или 0.

Другими словами (или другой код):

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

То же самое для сообщений [путь], только он инициализирует его некоторым объектом, а не пустым массивом.

1 голос
/ 20 декабря 2011

Ключ к пониманию логического оператора ИЛИ (||). В JavaScript сначала проверяется выражение слева от оператора. Если он принимает значение true, это выражение возвращается; если он принимает значение false, возвращается выражение справа. Это отличный способ присвоения значений по умолчанию переменной.

Во-вторых, connections[path] не обращается к элементу массива. Если path преобразуется в строку, то connections[path] эквивалентно connections.path, он просто обращается к этому члену объекта connections.

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

Человек, пишущий этот код, хотел, чтобы элемент пути был, если не сказать больше, пустым массивом. Эта строка в основном проверяет, является ли connections[path] правдивым . Если в этом path члене что-то есть, оно останется в покое; если нет, то это будет пустой массив.

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

Эта функция работает так же, как и в предыдущей строке, за исключением того, что значением по умолчанию является объект с двумя членами, а не пустой массив.

0 голосов
/ 20 декабря 2011

Я должен провоцировать ваше воображение

a ||b возвращает первый элемент, который не содержит никакого ложного значения.

connections[ path ] || []; 
//  return [] ( empty array) if connections[ path ] is return false ( or undefined, 0, [], "", NaN etc)
0 голосов
/ 20 декабря 2011

Например, пусть соединение и сообщения будут объектами, как показано ниже.

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. пути присваивается пустая строка, если его нет в объекте, упомянутом выше,2. Аналогичным образом, путь сообщений будет указывать путь в объекте «Путь».В противном случае это будет объект 'version' и 'body'

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

, а сообщения - это просто JSON-представление объекта javascript.Таким образом, connection [путь] такой же, как connections.path.Знак ||используется для назначения пустых значений, если фактическое значение отсутствует или не определено в объекте.

0 голосов
/ 20 декабря 2011

Оператор || означает ИЛИ, поэтому connections[ path ] = connections[ path ] || [];

мы выполняем проверку, чтобы увидеть, если connections[ path ] === null или connections[ path ] === undefined, в этом случае мы присваиваем connections[ path ] пустому массиву.

С помощью messages[ path ] мы выполняем ту же проверку, и если она является нулевой или неопределенной, мы присваиваем ей значение { version: 0, body: ''}

0 голосов
/ 20 декабря 2011
connections[ path ] = connections[ path ] || [];

примерно переводится как

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

В этом случае это удобный способ установить значение по умолчанию для connections[path] (то есть установить значение на [], если никакое значение уже не установлено)

В некоторых языках (например, Ruby) это можно написать еще короче

connections[path] ||= []
...