我正在尝试理解用Javascript编写的一些代码,而我却陷入了语法困境。
var connections = {}; // I know '{}' means new Object()
var messages = {};
对象包含变量路径,版本等,但在代码中,以下行是做什么的?
connections[ path ] = connections[ path ] || [];
messages[ path ] = messages[ path ] || { version: 0, body: ''};
答案 0 :(得分:4)
由于connections
和messages
是对象,[
和]
不表示数组索引,而是访问成员的语法,其中使用了变量找到变量的名称。
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 ] || [];
我们正在检查是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)