默认情况下,数组具有“长度”属性。
我可以向它们添加自定义属性吗?
无需使它们成为对象。
默认情况下,数组具有“长度”属性。
我可以向它们添加自定义属性吗?
无需使它们成为对象。
当然。
var arr = [1,2,3,4,5];
arr.prop = 'value';
数组在 JavaScript中已经是对象——它们只是有一些额外的功能和特殊的文字语法。
正如其他答案所述,这是完全可能的,因为 JavaScript 中的数组只是对象。然而,这是否是一个好主意仍然存在一个问题。
这是一个“编码风格”问题,所以很难客观地说,但是 Douglas Crockford 对此没有问题(至少在某些情况下)。在JavaScript: The Good Parts 中,他实际上使用了向数组添加“total”方法的示例。
因为数组实际上是一个对象,所以我们可以直接向单个数组添加方法:
// Give the data array a total function data.total = function () { return this.reduce(add, 0); }; total = data.total(); // total is 108
由于字符串
'total'
不是整数,因此向total
数组添加属性不会改变其长度。
(第 62 页,Crockford 的“JavaScript The Good Parts”,可在Google 图书上找到)
但是,值得一提的是,这些额外的属性不包含在 JSON 序列化中,如果您执行类似arr = arr.slice(1);
.
如果您打算将它隐藏在数组等中(至少这就是我正在寻找的):
Object.defineProperty( targ, "myVal", { enumerable: false, writable: true } );
然后数组不会将它添加到长度,所以它是一个属性,而不是我猜你可以说的值。
然后,如果您想查看对象中的键,则 Object.keys 不会看到它,但Reflect.ownKeys()会。
defineProperty 的 Reflect 版本将返回成功或失败,而 Object 的返回传递的对象。
请记住Reflect.preventExtensions()将(就像它说的那样)阻止您或其他人扩展它们。
数组是对象,因此您可以向它们添加自己的属性:
var arr = [1, 2, 3];
arr.foo = 'bar';
从其他答案扩展,这里有以下迭代数组的方法,不包括自定义属性。
使用标准for循环
for (let i = 0; i < arr_length; i++)
console.log(arr[i]);
或者如果不使用 ES6:
for (var i = 0; i < arr.length; i++)
console.log(arr[i]);
使用for ... of
循环 (ES6+)
for (let el of arr)
console.log(el)
使用Array.prototype.forEach
(ES6+)
arr.forEach(el => console.log(el));
或者
arr.forEach(function(el) {
console.log(el);
});
迭代数组,包括所有属性(例如,自定义属性,length
):
for (let prop in arr)
console.log(prop);
或者如果不使用 ES6:
for (var prop in arr)
console.log(prop);
是的。您可以通过声明将它们添加到对象中,也可以使用 Array.prototype 扩展 Array
var j = new Array();
j.yourprop = "foo";