将属性添加到javascript数组

时间:2012-03-31 01:07:52

标签: javascript arrays

默认情况下,数组具有“length”属性。

我可以为他们添加自定义属性吗?

无需制作对象

5 个答案:

答案 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

扩展Array
var 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);