我正在try 类似的方法,但这个例子不起作用.
jsObj = {};
for (var i = 1; i <= 10; i++) {
jsObj{'key' + i} = 'example ' + 1;
}
我能做什么来制作这样的动态键?
我正在try 类似的方法,但这个例子不起作用.
jsObj = {};
for (var i = 1; i <= 10; i++) {
jsObj{'key' + i} = 'example ' + 1;
}
我能做什么来制作这样的动态键?
方括号:
jsObj['key' + i] = 'example' + 1;
在JavaScript中,所有数组都是对象,但并非所有对象都是array.主要区别(也是很难用普通JavaScript和纯对象模拟的)是数组实例维护length
属性,以便它反映名称为数字的属性的数值加1,并且其值在转换为数字时是所有此类属性中最大的.这听起来真的很奇怪,但这只是意味着给定一个数组实例,名称为"0"
、"5"
、"207"
等的属性都被特殊对待,因为它们的存在决定了值length
.最重要的是,length
的值可以是set到remove个这样的属性.将数组的length
设置为0
实际上会删除名称看起来像整数的所有属性.
这就是数组的特殊之处.然而,所有这些都与JavaScript [ ]
操作符的工作方式无关.该操作符是一种对象属性访问机制,可用于任何对象.在这方面需要注意的是,就简单的属性访问而言,数字数组属性名并不特殊.它们只是碰巧看起来像数字的字符串,但JavaScript对象属性名称可以是任何类型的字符串.
因此,在数组for
中迭代运算符:
for (var i = 0; i < myArray.length; ++i) {
var value = myArray[i]; // property access
// ...
}
实际上与[ ]
访问名称为某个计算字符串的属性时的工作方式没有什么不同:
var value = jsObj["key" + i];
[ ]
号操作员在这两种情况下都在做同样的事情.换句话说,在一种情况下,所涉及的对象恰好是一个数组这一事实并不重要.
当setting属性值使用[ ]
时,对于维护length
属性的特殊行为,故事与except相同.如果在数组实例上使用数字键设置属性:
myArray[200] = 5;
然后(假设"200"是最大的数字属性名称),作为属性分配的副作用,length
属性将更新为201
.但是,如果对普通对象执行相同的操作:
myObj[200] = 5;
没有这种副作用.数组和对象的名为"200"的属性将以完全相同的方式设置为值5
.
有人可能会认为,因为这length
个行为很方便,所以您还可以使all个对象实例成为Array构造函数的实例,而不是普通对象.这并没有什么直接的错误(尽管有些属性包含在length
个属性中,而不包括其他属性,这可能会让人感到困惑,特别是对于熟悉其他一些语言的人来说).但是,如果您正在使用JSON序列化(这是相当常见的事情),请理解数组实例是以only涉及数字命名属性的方式序列化为JSON的.添加到数组中的其他属性永远不会出现在序列化的JSON表单中.例如:
var obj = [];
obj[0] = "hello world";
obj["something"] = 5000;
var objJSON = JSON.stringify(obj);
"objJSON"的值将是一个只包含["hello world"]
的字符串;"某物"的财产将丢失.
如果您能够使用ES6 JavaScript特性,则可以使用Computed Property Names非常轻松地处理此问题:
var key = 'DYNAMIC_KEY',
obj = {
[key]: 'ES6!'
};
console.log(obj);
// > { 'DYNAMIC_KEY': 'ES6!' }