2011-12-20 6 views
0

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

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

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

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

Чтобы быть подданным, '{}' не совпадает с 'new Object()' (даже если 'Object' не был перезаписан). Но это достаточно близко. Разница тонкая, и вы, вероятно, никогда не заметите разницы. –

+2

@tri: Я не уверен, что полезно указать небольшую ошибку педантичной детали, если вы на самом деле не говорите, в чем разница. –

+2

@ тринитис-do рассказывать. В ES5 11.1.5 говорится: 'Производственный ObjectLiteral: {} оценивается следующим образом: 1. Верните новый объект, созданный, как если бы выражение new Object(), где Object является стандартным встроенным конструктором с этим именем'. Итак, что такое «тонкая разница»? – RobG

ответ

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

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

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

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

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

connections[path] ||= [] 
2

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

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

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

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

4

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

    ... 

} 
0

The || средства оператора или так с connections[ path ] = connections[ path ] || [];

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

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

+1

Код фактически проверяет все, что есть * falsy *; все, что разрешает false при использовании в качестве условия. Помимо 'null' и' undefined', это также проверяет '0',' ''', 'false' и' NaN'. –

+0

@ Давид Хедлунд - Хороший вопрос, и я согласен с тем, что выше, в моей спешке, чтобы получить какой-либо ответ здесь, я не перечислял полную проверку. –

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

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

+0

Я думаю, что этот пример немного запутан в том, что 'messages' сам содержит' version' и 'body', что заставило бы читателя думать, что это могут быть члены, которые могут быть изменены (это не так, и я не думайте, что вы говорите, что это тоже), а также потому, что он подразумевает, что «путь =« путь », который, как мне кажется, ясен из-за использования переменной, в первую очередь, что она не всегда будет. –

+0

Спасибо, Дэвид! Собственно, ваше объяснение кажется более правильным. –

0

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

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

connections[ path ] || []; 
// return [] (empty array) if connections[ path ] is return false (or undefined, 0, [], "", NaN etc) 
1

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

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^