默认情况下,数组具有“length”属性。
我可以为他们添加自定义属性吗?
无需制作对象
答案 0 :(得分:47)
不确定
var arr = [1,2,3,4,5];
arr.prop = 'value';
数组在JavaScript中已经是已经对象 - 它们只有一些额外的功能和特殊的文字语法。
答案 1 :(得分:31)
正如其他答案所述,这是完全可能的,因为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
属性不会改变其长度。
(p62,Crockford的“JavaScript The Good Parts”,发现于Google Books)
但是,值得一提的是,这些额外的属性不包含在JSON序列化中,如果您执行arr = arr.slice(1);
之类的操作,则会被丢弃。
答案 2 :(得分:3)
如果您打算将其隐藏在数组等中? [至少那是我在寻找的东西。]
Object.defineProperty( targ, "myVal", { enumerable: false, writable: true } );
然后数组不会将它添加到长度中,因此它的属性不是我想你可以说的值。
然后,如果你想看一个对象中的键,例如Object.keys不会看到它,但是Reflect.ownKeys会。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys
defineProperty的Reflect版本将返回成功或失败,而Object返回传递的对象。
请记住,preventExtensions会(就像它说的那样)阻止你或其他人扩展它们。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions
答案 3 :(得分:2)
是。您只需声明它们就可以将它们添加到对象中,也可以使用Array.prototype
扩展Arrayvar j = new Array();
j.yourprop = "foo";
答案 4 :(得分:0)
数组是对象,因此可以向其添加自己的属性:
var arr = [1,2,3]; arr.foo ='bar';
从其他答案中扩展出来,以下是遍历数组的以下几种方法,不包括自定义属性。
1)使用标准的循环
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]);
2)使用for ... of
循环(ES6 +)
for (let el of arr)
console.log(el)
3)使用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);