将属性添加到javascript数组
默认情况下,数组具有“长度”属性。
我可以向他们添加自定义属性吗?
不必让它们成为对象
当然。
var arr = [1,2,3,4,5];
arr.prop = 'value';
数组已经是JavaScript中的对象-它们仅具有一些额外的功能和特殊的文字语法。
正如其他答案所述,这是完全有可能的,因为JavaScript中的数组只是对象。 但是,仍然存在一个问题,即它是否是一个好主意。
这是一个“编码风格”的问题,因此很难客观地说,但是道格拉斯·克罗克福德对此没有任何问题(至少在某些情况下)。 在JavaScript:The Good Parts中,他实际上使用了向数组添加“总计”方法的示例。
因为数组实际上是一个对象,所以我们可以将方法直接添加到单个数组中:
arr = arr.slice(1);
由于字符串
arr = arr.slice(1);
不是整数,因此将total
属性添加到数组不会更改其长度。
(第62页,Crockford的“ JavaScript的好部分”,可在Google图书中找到)
但是,值得一提的是,这些额外的属性不包含在JSON序列化中,如果您执行arr = arr.slice(1);
之类的操作,它们将被丢弃。
如果您打算将其隐藏在Array等中?[至少那是我想要的。]
Object.defineProperty( targ, "myVal", { enumerable: false, writable: true } );
然后数组不会将其添加到长度,因此它是一个属性而不是一个值,我猜您可以说。
然后,如果要查看对象中的键,则Object.keys将看不到,而Reflect.ownKeys将看到。
[HTTPS://developer.Mozilla.org/恩-US/docs/Web/JavaScript/reference/global_objects/reflect/own keys]
Reflect版本的defineProperty将返回成功或失败,而Object则返回传递的对象。
请记住,preventExtensions会(如它所说的)阻止您或其他人扩展它们。[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions]
是。 您可以通过声明它们将它们添加到对象中,也可以使用Array.prototype扩展Array。
var j = new Array();
j.yourprop = "foo";
数组是对象,因此可以向它们添加自己的属性:
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)使用length
回路(ES6 +)
for (let el of arr)
console.log(el)
3)使用length
(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);