Добавить свойство в массив 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";