0

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

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

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

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

7 回答 7

4

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

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

   ...

}
于 2011-12-20T08:15:52.700 回答
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] 相同,只是它用一些对象而不是空数组来初始化它。

于 2011-12-20T08:14:53.343 回答
1

关键是理解逻辑 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: '' };

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

于 2011-12-20T08:26:01.173 回答
0
connections[ path ] = connections[ path ] || [];

大致翻译为

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

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

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

connections[path] ||= []
于 2011-12-20T08:13:13.917 回答
0

运算符的||意思是 OR 所以connections[ path ] = connections[ path ] || [];

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

我们执行相同的检查,如果它是 null 或 undefined,我们将messages[ path ]其赋值为{ version: 0, body: ''}

于 2011-12-20T08:18:17.533 回答
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.如果上面提到的对象中不存在路径,则将其分配为空白字符串。2.类似地,消息路径将是对象“路径”中存在的路径。否则,它将是 'version' 和 'body' 的对象

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

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

于 2011-12-20T08:20:51.203 回答
0

我应该激发你的想象力

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

connections[ path ] || []; 
//  return [] ( empty array) if connections[ path ] is return false ( or undefined, 0, [], "", NaN etc)
于 2011-12-20T08:23:00.073 回答