对象数组的Javascript文字表示法

时间:2011-12-20 08:10:44

标签: javascript arrays literals notation

我正在尝试理解用Javascript编写的一些代码,而我却陷入了语法困境。

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

对象包含变量路径,版本等,但在代码中,以下行是做什么的?

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

7 个答案:

答案 0 :(得分:4)

由于connectionsmessages是对象,[]不表示数组索引,而是访问成员的语法,其中使用了变量找到变量的名称。

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

以上,因为path = 'x'等于

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

它说,如果由path的值命名的两个对象的成员存在,请保留它(将其当前值分配给它自己),否则(||用于此处的合并)创建新的空数组或新的{ version: 0, body: '' }

请注意,coalesce / logical 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';

   ...

}

答案 1 :(得分:2)

基本上,如果之前尚未初始化路径属性,或者它包含null或false或0,则初始化路径属性。

换句话说(或其他代码):

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

对于messages [path],它只用一些对象而不是空数组初始化它。

答案 2 :(得分:1)

关键是要理解逻辑OR(||)运算符。在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: '' };

它的功能与上一行的功能相同,只是默认值是一个包含两个成员的对象而不是一个空数组。

答案 3 :(得分:0)

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

大致翻译为

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

在这种情况下,这是设置connections[path]默认值的便捷方式(即,如果尚未设置值,则将值设置为[]

在某些语言(例如Ruby)中,这可以写得更短

connections[path] ||= []

答案 4 :(得分:0)

||运算符对connections[ path ] = connections[ path ] || [];

表示OR

我们正在检查是connections[ path ] === null还是connections[ path ] === undefined,如果是这种情况,我们会将connections[ path ]分配给空数组。

使用messages[ path ]我们执行相同的检查,如果它为null或未定义,我们为其赋值{ version: 0, body: ''}

答案 5 :(得分: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.同样,消息路径将是对象“路径”中存在的路径。否则,它将成为'version'和'body'的对象

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

连接和消息只是javascript对象的JSON表示。因此,connections [path]与connections.path相同。签署||用于在对象中不存在或未定义实际值时分配空白值。

答案 6 :(得分:0)

我应该激发你的想象力

a || b返回第一个不包含任何伪值的元素。

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