簡體   English   中英

如何在Javascript中以數字為字符串的關聯數組

[英]How to make associative array with number as string in Javascript

我有一個代碼:

var index = 100;

var arr =[];

arr[index.toString()] = "Hello"

結果:索引仍然稱為整數而不是字符串。 任何人都可以解釋我的代碼有什么問題嗎?

您必須使用{}聲明關聯數組 ,這會創建一個新object ,因為在JavaScript中,數組始終使用編號索引。

您需要聲明一個對象: var arr={};

  • 數組使用編號索引
  • 對象使用命名索引

 var index = 100; var arr ={}; arr[index.toString()] = "Hello"; console.log(arr); 

如何在Javascript中以數字為字符串的關聯數組

從沒有經常使用術語的意義上講,JavaScript沒有關聯數組。 它具有對象,從ES2015(又稱“ ES6”)開始,它具有Map

結果:索引仍然稱為整數而不是字符串。 任何人都可以解釋我的代碼有什么問題嗎?

index 變量的值仍然是一個數字,是的,因為您沒有做任何更改。 但是數組中的索引是一個字符串(即使您沒有使用.toString() ),因為標准數組實際上並不是真正的數組 1 ,它們是經過特殊處理的一類屬性的對象(其名稱是符合數組索引的規范定義的字符串的名稱),特殊的length屬性,並使用Array.prototype作為其原型。

這證明數組索引是字符串:

 var a = []; a[0] = "zero"; for (var name in a) { console.log("name == " + name + ", typeof name == " + typeof name); } 

就是說,當您想要通用對象或映射時,您不想使用數組。

這里使用通用對象進行名稱/值映射:

 var o = Object.create(null); var name = "answer"; o[name] = 42; console.log(o[name]); // 42 

對象中的屬性名稱是字符串或(從ES2015開始)符號。 我使用Object.create(null)創建對象,因此它不會以Object.prototype作為其原型,因為這會給我們提供我們不希望使用的屬性( toStringvalueOf等)。對象作為地圖。

這是使用Map

 var m = new Map(); var name = "answer"; m.set(name, 42); console.log(m.get(name)); // 42 

Map與對象相比的主要優點是:

  • 它們的鍵可以是任何東西,而不僅僅是字符串或符號
  • 它們是可迭代的 ,因此您可以使用for-of來遍歷它們包含的映射
  • Mapsize屬性告訴您它們有多少個條目
  • Map保證其條目的迭代按照條目添加到地圖的順序執行

使用ES6,您可以使用Map ,該Map保留任何類型的鍵。

 var map = new Map; map.set(100, "Hello"); map.set('100', "Foo"); console.log(map.get(100)); // 'Hello' console.log(map.get('100')); // 'Foo' console.log([...map]); 

JavaScript不支持帶有命名索引的數組 ,在JavaScript中,數組始終使用編號索引。

如果您使用命名索引,JavaScript會將數組重新定義為標准對象。 之后,所有數組方法和屬性將產生錯誤的結果。

如以下示例所示:

 var person = []; person["firstName"] = "John"; person["lastName"] = "Doe"; person["age"] = 46; var x = person.length; // person.length will return 0 console.log(x); var y = person[0]; // person[0] will return undefined console.log(y); 

暫無
暫無

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

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