Массивы по умолчанию имеют свойство "длина".
Можно ли добавить к ним настраиваемые свойства?
Без создания объектов
Массивы по умолчанию имеют свойство "длина".
Можно ли добавить к ним настраиваемые свойства?
Без создания объектов
Конечно.
var arr = [1,2,3,4,5];
arr.prop = 'value';
Массивы уже являются объектами в JavaScript - у них просто есть дополнительные функции и специальный литерал-синтаксис.
Как утверждают другие ответы, это вполне возможно, потому что массивы в JavaScript - это просто объекты. Тем не менее, есть еще вопрос о том, хорошая ли это идея или нет.
Это вопрос "стиль кодирования", поэтому трудно сказать объективно, но у Дугласа Крокфорда нет проблем с ним (по крайней мере, в некоторых случаях). В JavaScript: Хорошие части он фактически использует пример добавления метода "total" к массиву.
Поскольку массив действительно является объектом, мы можем добавлять методы непосредственно к отдельному массиву:
// 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 Хорошие детали", найденный в Google Books)
Однако стоит упомянуть, что эти дополнительные свойства не включены в сериализацию JSON и будут выброшены, если вы сделаете что-то вроде arr = arr.slice(1);
.
Да. Вы можете добавить их к объекту, просто объявив их, и вы также можете расширить Array с помощью Array.prototype
var j = new Array();
j.yourprop = "foo";
Если вы хотели спрятать его в массиве и т.д.? [по крайней мере, то, что я искал.]
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
Версия Reflect для defineProperty вернет успех или потерпит неудачу, в то время как Object возвращает переданный объект.
Помните, что предупреждения будут (или, как говорится, запрещены) не позволяют вам или другим продлить их. 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);