簡體   English   中英

對象數組的Javascript文字符號

[英]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: ''};

因為connectionsmessages是對象,所以[]並不表示數組索引,而是訪問成員的語法,其中使用變量來查找變量的名稱。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM