对象数组的 Javascript 文字表示法

Javascript literal notation for array of objects

本文关键字:表示 文字 Javascript 数组 对象      更新时间:2023-09-26

我试图理解一些用Javascript编写的代码,但我被困在语法上。

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

对象包含变量路径、版本等,但在代码中,以下行有什么作用?

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

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

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

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

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

它的意思是,如果由 path 的值命名的两个对象的成员存在,请保留它(将其当前值分配给自身(,否则(此处||用于合并(分别创建一个新的空数组或一个新的{ 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';
   ...
}
基本上,

如果之前没有初始化过 path 属性,或者它包含 null 或 false 或 0,它就会初始化 path 属性。

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

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

与消息[路径]相同,只是它使用某个对象而不是空数组对其进行初始化。

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

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

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

大致翻译为

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

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

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

connections[path] ||= []

||运算符表示 OR so 与 connections[ path ] = connections[ path ] || [];

我们正在执行检查以查看 connections[ path ] === null 或是否 connections[ path ] === undefined ,如果是这种情况,我们将connections[ path ]分配给空数组。

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

例如,让连接和消息成为对象,如下所示。

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.同样,消息的路径将是对象"路径"中存在的路径。否则,它将是"版本"和"正文"的对象

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

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

我应该激发你的想象力

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

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