将属性添加到javascript数组

ell*_*uty 43 javascript arrays

默认情况下,数组具有"长度"属性.

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

无需使它们成为对象

Kev*_*nis 51

当然.

var arr = [1,2,3,4,5];
arr.prop = 'value';
Run Code Online (Sandbox Code Playgroud)

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

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

clo*_*eet 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
Run Code Online (Sandbox Code Playgroud)

由于字符串'total'不是整数,因此向total数组添加属性不会更改其长度.

(p62,Crockford的"JavaScript The Good Parts",在Google Books上找到)

但是,值得一提的是,这些额外的属性不包含在JSON序列化中,如果您执行任何操作,它们将被丢弃arr = arr.slice(1);.

  • 此外,如果数组使用其任何原型方法(map、filter 等),则该属性将不会转移到新数组,因为该方法被放置在“Array”的实例上。可能是预料之中的,但在这种情况下可能并不理想? (2认同)

Mas*_*mes 6

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

Object.defineProperty( targ, "myVal", { enumerable: false, writable: true } );
Run Code Online (Sandbox Code Playgroud)

然后数组不会将它添加到长度,所以它是一个属性,而不是我猜你可以说的值。

然后,如果您想查看对象中的键,则 Object.keys 不会看到它,但Reflect.ownKeys()会。

defineProperty 的 Reflect 版本将返回成功或失败,而 Object 的返回传递的对象。

请记住Reflect.preventExtensions()将(如它所说)阻止您或其他人扩展它们。