簡體   English   中英

在 javascript 中命名對象的數組中 - 名稱是否可訪問?

[英]In an array of named objects in javascript - are the names accessible?

如果我們創建一些對象,並用這些對象填充一個數組,名稱是存儲在數組中,還是僅存儲對象的屬性? 我想這可能是微不足道的,但我一直無法找到答案。

var boxA = {color: "red", width: 100};
var boxB = {color: "yellow", width: 200};
var boxC = {color: "blue", width: 300};

boxArray = [boxA, boxB, boxC];

for (var i = 0; i < boxArray.length; i++) {

    //****
    // What code do we insert here to log
    // boxA
    // boxB
    // boxC
    //****

}

當然,添加是一個微不足道的解決方法

boxA.box = boxA; 

等然后打電話

console.log(boxArray[i].box);

但這真的有必要嗎?

要直接回答您的問題-不,您不能做您要問的事情。 我已經遇到過幾次相同的情況。 這就是我所做的。 除了使用數組之外,您還可以將對象添加到對象文字中,然后將該對象映射到某些唯一鍵(例如id)。

var boxes = {
  'boxA': {color: 'red', width: 100},
  'boxB': {color: 'blue', width: 200}, 
  'boxC': {color: 'yellow', width: 300}
}

for(var boxKey in boxes) {
    console.log(boxKey);
}

// to use
boxes.boxA; // do something with boxA

不,那不是那樣的。

變量名稱是由JS自動為您管理的內存區域中的對象的引用

詳細而言,這意味着:

var boxA = {color: "red", width: 100};

這個說法:

  1. 在堆中創建一個對象
  2. 將本地符號boxA與該對象關聯。

因此,該對象尚未被一個變量引用。

var boxArray = [boxA];

這里:

  1. 創建具有一個元素的數組。 該元素包含對對象的引用。 引用的副本應准確無誤。 因此,同一原始對象現在被引用兩次。
  2. boxArray分配了對該數組的引用,該引用也放置在堆中。

總結一下:變量名僅存在於代碼清單中,以使開發人員能夠更輕松地推斷出內存中的某些對象,而不是使用內存地址進行操作(這很可怕)。

好吧,boxArray充滿了您要放入其中的變量的值。 示例:如果要保存三個整數變量,而不是變量名。 因此,您的新boxArray等於:

boxArray = [{color: "red", width: 100},{color: "yellow", width: 200},{color: "blue", width: 300}];

如果要獲取對象的鍵,請嘗試Object.keys(object)

Object.keys(boxA)
 ["color", "width"] 

執行代碼無法訪問您的變量名,但是如果您需要執行此操作,則可以嵌套對象:

 var boxes = { boxA: { color: "red", width: 100 }, boxB: { color: "yellow", width: 200 }, boxC: { color: "blue", width: 300 } }; Object.keys(boxes).forEach(function(key) { console.log(key) // boxA, boxB, boxC console.log(boxes[key]) // {color: "red", width: 100}, etc. }); 

遲到了,但是……自從 ES6 javascript 引入了類。 如果類是一個選項,你可以這樣做:

class boxA { constructor() { this.color = "red"; this.width = 100; } };
class boxB { constructor() { this.color = "yellow"; this.width = 200; } };
class boxC { constructor() { this.color = "blue"; this.width = 300; } };

let boxArray = [new boxA(), new boxB(), new boxC()];

for (var i = 0; i < boxArray.length; i++) {
  console.log(boxArray[i].constructor.name);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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