Добавить свойство в массив javascript

Массивы по умолчанию имеют свойство length.

Могу ли я добавить собственные свойства к ним?

Без необходимости делать их объектами

5 ответов

Решение

Конечно.

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

Массивы уже являются объектами в JavaScript - они просто имеют некоторые дополнительные функции и специальный синтаксис.

Как утверждают другие ответы, это вполне возможно, потому что массивы в JavaScript - это просто объекты. Тем не менее, все еще остается вопрос о том, хорошая это идея или нет.

Это вопрос "стиля кодирования", поэтому сложно сказать объективно, но с Дугласом Крокфордом у него нет проблем (по крайней мере, в некоторых случаях). В JavaScript: "Хорошие части" он фактически использует пример добавления "общего" метода в массив.

Поскольку массив на самом деле является объектом, мы можем добавлять методы непосредственно в отдельный массив:

// Give the data array a total function

data.total = function () {
    return this.reduce(add, 0);
};

total = data.total();    // total is 108

Поскольку строка 'total' не является целым числом, добавив total Свойство для массива не меняет его длины.

(p62, Крокфорд "JavaScript The Good Parts", найденный в Google Книгах)

Однако стоит упомянуть, что эти дополнительные свойства не включены в сериализацию JSON и будут выброшены, если вы сделаете что-либо подобное arr = arr.slice(1);,

Если вы хотели скрыть это в массиве и т. Д.? [по крайней мере, это то, что я искал.]

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

Версия Define defineProperty вернет успех или неудачу, в то время как Object возвращает переданный объект.

Помните, что warnExtensions (как говорится) не позволит вам или другим расширить их. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions

Массивы являются объектами, и поэтому вы можете добавить свои собственные свойства к ним:

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

Да. Вы можете добавить их к объекту, просто объявив их, и вы также можете расширить Array, используя Array.prototype

var j = new Array();
j.yourprop = "foo";
Другие вопросы по тегам