[英]Javascript literal notation for array of objects
我試圖理解一些用Javascript編寫的代碼,但我陷入了語法束縛。
var connections = {}; // I know '{}' means new Object()
var messages = {};
這些對象包含變量path,version等,但是在代碼中接下來的幾行呢?
connections[ path ] = connections[ path ] || [];
messages[ path ] = messages[ path ] || { version: 0, body: ''};
因為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';
...
}
基本上,如果之前沒有初始化過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];
}
與message [path]相同,只是它使用某個對象而不是空數組來初始化它。
關鍵是要了解邏輯OR( ||
)運算符。 在JavaScript中,首先測試運算符左側的表達式。 如果解析為true,則返回該表達式。 如果解析為false,則返回右側的表達式。 這是將默認值分配給變量的好方法。
其次, connections[path]
沒有訪問數組的元素。 如果path
解析為字符串,則connections[path]
等同於connections.path
,它只是訪問connections
對象的成員。
connections[path] = connections[path] || [];
編寫此代碼的人希望path成員是一個空數組,如果沒有其他問題的話。 這行基本上是在檢查connections[path]
是否為true 。 如果該path
成員中有東西,它將被單獨放置; 如果沒有,它將是一個空數組。
messages[path] = messages[path] || { version: 0, body: '' };
除了默認值是對象中包含兩個成員而不是空數組之外,此功能與上一行相同。
connections[ path ] = connections[ path ] || [];
大致翻譯成
connections[ path ] = connections[ path ] != null ? connections[ path] : [];
在這種情況下,這是為connections[path]
設置默認值的便捷方法(即,如果尚未設置任何值,則將值設置為[]
)
在某些語言(例如Ruby)中,這可以寫得更短
connections[path] ||= []
||
運算符表示“或”,即connections[ path ] = connections[ path ] || [];
connections[ path ] = connections[ path ] || [];
我們正在檢查以查看connections[ path ] === null
還是connections[ path ] === undefined
,如果是這種情況,我們將connections[ path ]
分配給一個空數組。
使用messages[ path ]
我們執行相同的檢查,如果它為null或未定義,我們將其賦值為{ 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.path被分配為空字符串,如果它在上述對象中不存在。 2.同樣,消息的路徑將是對象“路徑”中存在的路徑。 否則,它將是“版本”和“身體”的對象
connections[ path ] = connections[ path ] || [];
messages[ path ] = messages[ path ] || { version: 0, body: ''};
連接和消息只是javascript對象的JSON表示。 因此,connections [path]與connections.path相同。 簽名|| 如果對象中不存在實際值或未定義實際值,則用於分配空白值。
我應該激起你的想象力
|| b返回不包含任何假值的第一個元素。
connections[ path ] || [];
// return [] ( empty array) if connections[ path ] is return false ( or undefined, 0, [], "", NaN etc)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.