2017-02-01 51 views
1

我有一個代碼:如何使數關聯數組作爲字符串在Javascript

var index = 100; 

var arr =[]; 

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

結果:指數仍稱爲整數字符串。任何人都可以解釋我的代碼有什麼問題?

+1

數組索引是整數,使用對象'變種ARR = {}' –

+1

@PranavCBalan:實際上,一個鍵數組是字符串,就像任何其他對象一樣。 –

+0

JavaScript沒有「關聯數組」。但更重要的是,你試圖解決的實際問題是什麼?儘可能簡單地將編碼問題簡化爲例子,但也許我們在這裏做得太過分了。你想解決什麼現實生活中的問題?代碼的輸入和期望的輸出是什麼? –

回答

3

你必須使用{},這將創建一個新的object申報關聯數組,因爲在JavaScript中,數組總是使用編號的索引。

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

  • 陣列使用編號指標
  • 對象使用命名索引

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

+2

沒有。數組是對象,它們可以具有非索引屬性(事實上,甚至數組索引也是字符串)。 –

+0

@ T.J.Crowder,數組是一種特殊的對象,帶有編號索引。 –

+0

對。哪些是字符串。從[規範](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-object-type):「一個*整數索引*是一個字符串值的屬性鍵是一個規範的數字字符串(見7.1.16),其數值是+0或正整數≤2^53-1。*數組索引*是一個*整數索引*,其數值i在範圍+0 ≤I<2^32-1「。 –

0

隨着ES6,你可以使用一個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]);

2

如何使數關聯數組作爲字符串在Javascript

JavaScript沒有在長期頻繁使用感關聯數組。它有對象,並且從ES2015(又名「ES6」)開始,它有Map s。

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

index變量的價值仍然是一個號碼,是的,因爲你沒有做任何事情去改變它。但是,數組中的索引是一個字符串(即使您沒有使用.toString()也是如此),因爲標準數組是aren't really arrays at all ,它們是對一類屬性進行特殊處理的對象(名稱是字符串的對象符合規範的數組索引定義),一個特殊的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作爲它的原型,因爲如果我們將該對象用作映射,那麼它會給我們不需要的屬性(toString,valueOf等)。

下面是一個使用Map

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

主要優點Map■找過對象是:

  • 他們的鑰匙可以是任何東西,而不僅僅是字符串或符號
  • 他們是迭代,這樣你就可以通過它們包含
  • Map S中的映射,使用for-of循環有size屬性告訴你他們有多少項是順序執行的條目的迭代
  • Map的擔保項被添加到地圖
0

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);

+0

_如果使用命名索引,JavaScript會將數組重新定義爲標準對象。之後,所有的數組方法和屬性都會產生不正確的結果。不,這不是它的工作方式。數組也是一個對象,您可以將值分配給數字索引或命名屬性,兩者都可以工作。僅僅因爲您將值指定給命名屬性,數組不會切換到「對象模式」。數字索引和'.length'之後的工作方式相同。當然,如果我們談論優化_性能可能會改變,但實際的_behavior_不會改變。 –

相關問題