如何在 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);
在 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]);
How to make associative array with number as string in Javascript
JavaScript 在经常使用术语的意义上没有关联数组。它有对象,从 ES2015(又名 "ES6")开始,它有 Map
s.
The result : index still known as integer not a string. Anyone can explain what's wrong with my code?
index
变量的值仍然是一个数字,是的,因为你没有做任何改变它的事情。但是数组中的索引是一个字符串(即使您不使用 .toString()
也是如此),因为标准数组 aren't really arrays at all1,它们是对 class 属性(其名称是符合数组索引定义的字符串)进行特殊处理的对象,一个特殊的 length
属性,以及使用 Array.prototype
作为他们的原型。
这里证明数组索引是字符串:
var a = [];
a[0] = "zero";
for (var name in a) {
console.log("name == " + name + ", typeof name == " + typeof name);
}
也就是说,当您需要通用对象或地图时,您不想使用数组。
此处使用通用对象进行 name/value 映射:
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
s 有一个 size
属性 告诉你他们有多少条目
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);
我有一个代码:
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);
在 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]);
How to make associative array with number as string in Javascript
JavaScript 在经常使用术语的意义上没有关联数组。它有对象,从 ES2015(又名 "ES6")开始,它有 Map
s.
The result : index still known as integer not a string. Anyone can explain what's wrong with my code?
index
变量的值仍然是一个数字,是的,因为你没有做任何改变它的事情。但是数组中的索引是一个字符串(即使您不使用 .toString()
也是如此),因为标准数组 aren't really arrays at all1,它们是对 class 属性(其名称是符合数组索引定义的字符串)进行特殊处理的对象,一个特殊的 length
属性,以及使用 Array.prototype
作为他们的原型。
这里证明数组索引是字符串:
var a = [];
a[0] = "zero";
for (var name in a) {
console.log("name == " + name + ", typeof name == " + typeof name);
}
也就是说,当您需要通用对象或地图时,您不想使用数组。
此处使用通用对象进行 name/value 映射:
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
s 有一个size
属性 告诉你他们有多少条目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);