Массивы — это тоже объекты JavaScript. Если смотреть на массивы под таким углом, то каждое свойство объекта имеет свой набор атрибутов.
Каждое свойство является либо «свойством данных» (data property), либо «свойством доступа» (accessor property):
- Свойство данных (data property) связывает значение ключа со значением языка ECMAScript и набором логических атрибутов Boolean.
- Свойство доступа (accessor property) связывает значение ключа с одной или двумя функциями средства доступа и набором логических атрибутов Boolean. Функции доступа используются для хранения или получения значения языка ECMAScript, связанного со свойством.
Свойство данных (data property) связывает значение ключа с атрибутами, перечисленными в таблице 3.
Имя атрибута | Область значений | Описание |
---|---|---|
[[Value]] | Любой тип из языка ECMAScript | Значение, полученное при доступе к свойству. |
[[Writable]] | Boolean | Если false, попытки кода ECMAScript изменить атрибут свойства [[Value]] с помощью [[Set]] не увенчаются успехом. |
[[Enumerable]] | Boolean | Если true, свойство будет нумероваться путем перечисления для входа (см. 13.7.5). В противном случае свойство называется неперечислимым (non-enumerable). |
[[Configurable]] | Boolean | Если false, попытки удалить свойство, изменить свойство на свойство доступа или изменить его атрибуты (кроме [[Value]] или изменение [[Writable]] на false) завершатся ошибкой. |
Таблица 3: Атрибуты свойства данных — Table 3: Attributes of a Data Property
Пример
Например у нас есть массив из чисел,
var massiv = [11, 22, 33, 44]
Мы можем получить собственные свойства объекта. Для этого мы обращаемся к конструктору Object и у него вызываем метод getOwnPropertyDescriptors(). Внутрь метода мы передаём один параметр — наш массив.
Object.getOwnPropertyDescriptors(massiv)
После этого нам возвращается объект с атрибутами свойств.
{0: {…}, 1: {…}, 2: {…}, 3: {…}, length: {…}} 0: {value: 11, writable: true, enumerable: true, configurable: true} 1: {value: 22, writable: true, enumerable: true, configurable: true} 2: {value: 33, writable: true, enumerable: true, configurable: true} 3: {value: 44, writable: true, enumerable: true, configurable: true} length: {value: 4, writable: true, enumerable: false, configurable: false} __proto__: Object
Мы видим, что каждый атрибут свойства объекта имеет значение true. Это значит, что мы можем:
- перезаписывать значение свойства
- обходить свойства в циклах
- удалять свойства
Информационные ссылки
Стандарт ECMAScript — Раздел «20.1.2.9 Object.getOwnPropertyDescriptors ( O )» — https://tc39.es/ecma262/#sec-object.getownpropertydescriptors