С 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';
...
}
Чтобы быть подданным, '{}' не совпадает с 'new Object()' (даже если 'Object' не был перезаписан). Но это достаточно близко. Разница тонкая, и вы, вероятно, никогда не заметите разницы. –
@tri: Я не уверен, что полезно указать небольшую ошибку педантичной детали, если вы на самом деле не говорите, в чем разница. –
@ тринитис-do рассказывать. В ES5 11.1.5 говорится: 'Производственный ObjectLiteral: {} оценивается следующим образом: 1. Верните новый объект, созданный, как если бы выражение new Object(), где Object является стандартным встроенным конструктором с этим именем'. Итак, что такое «тонкая разница»? – RobG