向 JavaScript 数组添加属性

IT技术 javascript arrays
2021-02-10 10:54:18

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

我可以向它们添加自定义属性吗?

无需使它们成为对象。

5个回答

当然。

var arr = [1,2,3,4,5];
arr.prop = 'value';

数组在 JavaScript已经是对象——它们只是有一些额外的功能和特殊的文字语法。

我的属性会与其余元素一起迭代吗?因为在 console.log 中我没有看到它带有像“长度”这样的不透明文本
2021-03-18 10:54:18
当您使用for(var key in arr). 但无论如何,你都不应该在数组上使用它,所以这对你来说应该不是问题。for(var i = 0; i < arr.length; i++)迭代将不包括这些属性(他们甚至不添加到阵列的长度)
2021-03-20 10:54:18
console.log 将显示属性,如果您只想访问属性也是如此。你可以keys = Object.keys(arr).slice(arr.length);然后您可以使用for in NOTE仅迭代键,但是当您将属性分配给数组时,您应该避免使用Numbersonly 因为它们将被解释为数组索引。IE(arr['7']会与arr[7]您的对象是否继承自混淆Array
2021-04-06 10:54:18
如果使用for in循环,则该属性将被迭代。在常规for循环中,它不会——因为您只能通过其数组索引访问每个成员。它也不会被原生数组 ES5 方法(如forEach.
2021-04-07 10:54:18
以上都是真的。例如,stringName.match(/regex/)返回一个数组,但是该数组还附加了两个额外的属性供您参考-“返回的数组有一个额外的输入属性,其中包含已解析的原始字符串。此外,它还有一个索引属性,它表示字符串中匹配项的从零开始的索引。” 但是,当您迭代返回的内容或console.log结果时,结果集不包含额外的属性,只包含数组本身的元素。
2021-04-07 10:54:18

正如其他答案所述,这是完全可能的,因为 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);.

感谢您提供参考。
2021-03-16 10:54:18
内置的RegExp.prototype.exec()返回数组是这样的。尝试<someRegExp>.exec(<someString>),你会得到一个像[<fullResult>, <subStrResults>, ..., index: <Number>, input: <origStr>]. 请参阅MDN
2021-03-24 10:54:18
此外,如果数组通过其任何原型方法(map、filter 等),则该属性不会转移到新数组,因为该方法已放在Array. 在这种情况下可能是预期的,但可能并不理想?
2021-04-03 10:54:18

如果您打算将它隐藏在数组等中(至少这就是我正在寻找的):

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';

从其他答案扩展,这里有以下迭代数组的方法,不包括自定义属性。

  1. 使用标准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]);
    
  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);

是的。您可以通过声明将它们添加到对象中,也可以使用 Array.prototype 扩展 Array

var j = new Array();
j.yourprop = "foo";
我更喜欢 var j = (function(array){return new array();}(window.Array))
2021-03-18 10:54:18
我更喜欢var j = function(array){return new array();}(window.Array)给我的()钥匙多一点寿命
2021-03-27 10:54:18