我有一个代码:
var index = 100;
var arr =[];
arr[index.toString()] = "Hello"
结果:索引仍称为整数而不是字符串。任何人都可以解释我的代码有什么问题吗?
答案 0 :(得分:3)
您必须使用{}
声明关联数组,这会创建一个新的object
,因为在JavaScript中,数组始终使用编号索引。
您需要声明一个对象:var arr={};
var index = 100;
var arr ={};
arr[index.toString()] = "Hello";
console.log(arr);
答案 1 :(得分:2)
如何在Javascript中使用数字作为字符串创建关联数组
JavaScript在经常使用术语的意义上没有关联数组。它有对象,从ES2015(又名" ES6")开始,它有Map
个。
结果:索引仍称为整数而不是字符串。任何人都可以解释我的代码有什么问题吗?
index
变量的值仍然是一个数字,是的,因为您还没有做任何改变它的事情。但是数组中的索引是一个字符串(即使你没有使用.toString()
也是如此),因为标准数组aren't really arrays at all 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
作为其原型,因为它为我们提供了属性(toString
,valueOf
等)如果我们将对象用作地图,我们就不会想要。
此处使用Map
:
var m = new Map();
var name = "answer";
m.set(name, 42);
console.log(m.get(name)); // 42

Map
对主题的主要优点是:
for-of
来遍历其中包含的映射Map
有一个size
属性,告诉您他们有多少条目Map
保证按条目添加到地图的顺序执行其条目的迭代答案 2 :(得分: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]);

答案 3 :(得分: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);