Поиск…
Синтаксис
- object = {}
- object = new Object ()
- object = Object.create (prototype [, propertiesObject])
- object.key = значение
- object ["key"] = значение
- object [Символ ()] = значение
- object = {key1: value1, "key2": value2, 'key3': value3}
- object = {conciseMethod () {...}}
- object = {[computed () + "key"]: значение}
- Object.defineProperty (obj, propertyName, propertyDescriptor)
- property_desc = Object.getOwnPropertyDescriptor (obj, propertyName)
- Object.freeze (OBJ)
- Object.seal (OBJ)
параметры
Имущество | Описание |
---|---|
value | Значение, присвоенное свойству. |
writable | Можно ли изменить значение свойства или нет. |
enumerable | Будет ли свойство перечисляться for in цикле или нет. |
configurable | Можно ли переопределить дескриптор свойства или нет. |
get | Вызывается функция, которая вернет значение свойства. |
set | Функция, вызываемая, когда для свойства присваивается значение. |
замечания
Объекты представляют собой коллекции пар ключ-значение или свойства. Ключами могут быть String
s или Symbol
s, а значения - либо примитивы (числа, строки, символы), либо ссылки на другие объекты.
В JavaScript значительное количество значений - это объекты (например, функции, массивы) или примитивы, которые ведут себя как неизменные объекты (числа, строки, логические значения). Их свойства или свойства их prototype
могут быть доступны с использованием точечной ( obj.prop
) или скобки ( obj['prop']
). Заметными исключениями являются специальные значения undefined
и null
.
Объекты хранятся по ссылке в JavaScript, а не по значению. Это означает, что при копировании или передаче в качестве аргументов функций, «копия» и оригинал являются ссылками на один и тот же объект, а изменение их свойств изменит одно и то же свойство другого. Это не относится к примитивам, которые неизменяемы и передаются по значению.
Object.keys
Object.keys(obj)
возвращает массив ключей данного объекта.
var obj = {
a: "hello",
b: "this is",
c: "javascript!"
};
var keys = Object.keys(obj);
console.log(keys); // ["a", "b", "c"]
Неглубокое клонирование
Функция Object.assign()
может использоваться для копирования всех перечислимых свойств из существующего экземпляра Object
в новый.
const existing = { a: 1, b: 2, c: 3 };
const clone = Object.assign({}, existing);
Сюда входят свойства Symbol
в дополнение к String
.
Объект rest / spread destructuring, который в настоящее время является предложением этапа 3, обеспечивает еще более простой способ создания неглубоких клонов экземпляров Object:
const existing = { a: 1, b: 2, c: 3 };
const { ...clone } = existing;
Если вам нужно поддерживать более старые версии JavaScript, наиболее совместимым способом клонирования объекта является ручное повторение его свойств и фильтрация унаследованных с использованием .hasOwnProperty()
.
var existing = { a: 1, b: 2, c: 3 };
var clone = {};
for (var prop in existing) {
if (existing.hasOwnProperty(prop)) {
clone[prop] = existing[prop];
}
}
Object.defineProperty
Это позволяет нам определить свойство в существующем объекте, используя дескриптор свойства.
var obj = { };
Object.defineProperty(obj, 'foo', { value: 'foo' });
console.log(obj.foo);
Консольный выход
Foo
Object.defineProperty
можно вызвать со следующими параметрами:
Object.defineProperty(obj, 'nameOfTheProperty', {
value: valueOfTheProperty,
writable: true, // if false, the property is read-only
configurable : true, // true means the property can be changed later
enumerable : true // true means property can be enumerated such as in a for..in loop
});
Object.defineProperties
позволяет вам определять сразу несколько свойств.
var obj = {};
Object.defineProperties(obj, {
property1: {
value: true,
writable: true
},
property2: {
value: 'Hello',
writable: false
}
});
Свойство только для чтения
Используя дескрипторы свойств, мы можем сделать свойство только для чтения, и любая попытка изменить его значение будет терпеть неудачно, значение не будет изменено, и никакая ошибка не будет выбрана.
writable
свойство в дескрипторе свойства указывает, может ли это свойство быть изменено или нет.
var a = { };
Object.defineProperty(a, 'foo', { value: 'original', writable: false });
a.foo = 'new';
console.log(a.foo);
Консольный выход
оригинал
Неперечислимое свойство
Мы можем избежать того, чтобы свойство отображалось for (... in ...)
циклов
enumerable
свойство дескриптора свойства сообщает, будет ли указанное свойство перечислить при прохождении через свойства объекта.
var obj = { };
Object.defineProperty(obj, "foo", { value: 'show', enumerable: true });
Object.defineProperty(obj, "bar", { value: 'hide', enumerable: false });
for (var prop in obj) {
console.log(obj[prop]);
}
Консольный выход
шоу
Заблокировать описание свойства
Дескриптор свойства может быть заблокирован, поэтому к нему не могут быть внесены изменения. По-прежнему можно будет использовать свойство обычно, назначая и извлекая значение из него, но любая попытка переопределить его вызовет исключение.
configurable
свойство дескриптора свойства используется для отказа от любых дальнейших изменений в дескрипторе.
var obj = {};
// Define 'foo' as read only and lock it
Object.defineProperty(obj, "foo", {
value: "original value",
writable: false,
configurable: false
});
Object.defineProperty(obj, "foo", {writable: true});
Эта ошибка будет выбрана:
TypeError: не может переопределить свойство: foo
И собственность будет по-прежнему доступна только для чтения.
obj.foo = "new value";
console.log(foo);
Консольный выход
первоначальное значение
Свойства Accesor (получить и установить)
Рассматривайте свойство как комбинацию из двух функций: одну для получения значения из нее, а другую для установки значения в ней.
Свойство get
дескриптора свойства - это функция, которая будет вызываться для извлечения значения из свойства.
Свойство set
также является функцией, оно будет вызываться, когда ему присвоено значение, а новое значение будет передано в качестве аргумента.
Вы не можете назначить value
или writable
дескриптор, который get
или set
var person = { name: "John", surname: "Doe"};
Object.defineProperty(person, 'fullName', {
get: function () {
return this.name + " " + this.surname;
},
set: function (value) {
[this.name, this.surname] = value.split(" ");
}
});
console.log(person.fullName); // -> "John Doe"
person.surname = "Hill";
console.log(person.fullName); // -> "John Hill"
person.fullName = "Mary Jones";
console.log(person.name) // -> "Mary"
Свойства со специальными символами или зарезервированными словами
Хотя обозначение свойства объекта обычно записывается как myObject.property
, это позволит использовать символы, которые обычно находятся в именах переменных JavaScript , в основном буквы, цифры и подчеркивание ( _
).
Если вам нужны специальные символы, такие как пробел, ☺ или контент, предоставленный пользователем, это возможно с помощью обозначения []
.
myObject['special property ☺'] = 'it works!'
console.log(myObject['special property ☺'])
Всезначные свойства:
В дополнение к специальным символам именам свойств, которые являются все-цифрами, потребуются записи в виде скобок. Однако в этом случае свойство не обязательно должно быть записано в виде строки.
myObject[123] = 'hi!' // number 123 is automatically converted to a string
console.log(myObject['123']) // notice how using string 123 produced the same result
console.log(myObject['12' + '3']) // string concatenation
console.log(myObject[120 + 3]) // arithmetic, still resulting in 123 and producing the same result
console.log(myObject[123.0]) // this works too because 123.0 evaluates to 123
console.log(myObject['123.0']) // this does NOT work, because '123' != '123.0'
Однако ведущие нули не рекомендуется, так как это интерпретируется как восьмизначное обозначение. (TODO, мы должны создать и связать пример, описывающий восьмеричную, шестнадцатеричную и экспоненциальную нотацию)
См. Также: [Массивы являются объектами].
Динамические / переменные имена свойств
Иногда имя свойства необходимо сохранить в переменной. В этом примере мы спрашиваем у пользователя, какое слово нужно искать, а затем предоставлять результат от объекта, который я назвал dictionary
.
var dictionary = {
lettuce: 'a veggie',
banana: 'a fruit',
tomato: 'it depends on who you ask',
apple: 'a fruit',
Apple: 'Steve Jobs rocks!' // properties are case-sensitive
}
var word = prompt('What word would you like to look up today?')
var definition = dictionary[word]
alert(word + '\n\n' + definition)
Обратите внимание, как мы используем нотацию []
для просмотра переменной с именем word
; если бы мы использовали традиционный .
но оно будет принимать значение буквально, следовательно:
console.log(dictionary.word) // doesn't work because word is taken literally and dictionary has no field named `word`
console.log(dictionary.apple) // it works! because apple is taken literally
console.log(dictionary[word]) // it works! because word is a variable, and the user perfectly typed in one of the words from our dictionary when prompted
console.log(dictionary[apple]) // error! apple is not defined (as a variable)
Вы также можете написать литералы с нотной записью []
, заменив переменное word
на строку 'apple'
. См. Пример [Свойства со специальными символами или зарезервированные слова].
Вы также можете установить динамические свойства с помощью синтаксиса:
var property="test";
var obj={
[property]=1;
};
console.log(obj.test);//1
Он делает то же самое, что:
var property="test";
var obj={};
obj[property]=1;
Массивы - объекты
Отказ от ответственности. Создание подобных массиву объектов не рекомендуется. Однако полезно понять, как они работают, особенно при работе с DOM. Это объясняет, почему регулярные операции массива не работают с объектами DOM, возвращаемыми из многих функций
document
DOM. (т.е.querySelectorAll
,form.elements
)
Предположим, мы создали следующий объект, который имеет некоторые свойства, которые вы ожидаете увидеть в массиве.
var anObject = {
foo: 'bar',
length: 'interesting',
'0': 'zero!',
'1': 'one!'
};
Затем мы создадим массив.
var anArray = ['zero.', 'one.'];
Теперь обратите внимание, как мы можем проверить как объект, так и массив таким же образом.
console.log(anArray[0], anObject[0]); // outputs: zero. zero!
console.log(anArray[1], anObject[1]); // outputs: one. one!
console.log(anArray.length, anObject.length); // outputs: 2 interesting
console.log(anArray.foo, anObject.foo); // outputs: undefined bar
Поскольку anArray
на самом деле является объектом, подобно anObject
, мы можем добавить пользовательские свойства anArray
в anArray
Отказ от ответственности. Массивы с пользовательскими свойствами обычно не рекомендуются, поскольку они могут вводить в заблуждение, но могут быть полезны в сложных случаях, когда вам нужны оптимизированные функции массива. (т.е. объекты jQuery)
anArray.foo = 'it works!';
console.log(anArray.foo);
Мы даже можем сделать anObject
объектом типа массива, добавив length
.
anObject.length = 2;
Затем вы можете использовать цикл цикла C for
перебора над anObject
как если бы это был массив. См. Итерацию массива
Обратите внимание, что anObject
- это только объект, подобный массиву . (также известный как список). Это не настоящий массив. Это важно, поскольку такие функции, как push
и forEach
(или любая функция удобства, найденная в Array.prototype
), по умолчанию не будут работать с объектами, подобными массиву.
Многие из DOM document
функций возвращает список (т.е. querySelectorAll
, form.elements
) , который похож на массив типа anObject
мы создали выше. См. Раздел Преобразование объектов массива в массивы
console.log(typeof anArray == 'object', typeof anObject == 'object'); // outputs: true true
console.log(anArray instanceof Object, anObject instanceof Object); // outputs: true true
console.log(anArray instanceof Array, anObject instanceof Array); // outputs: true false
console.log(Array.isArray(anArray), Array.isArray(anObject)); // outputs: true false
Object.freeze
Object.freeze
делает объект неизменным, предотвращая добавление новых свойств, удаление существующих свойств и изменение перечислимости, настраиваемости и возможности записи существующих свойств. Это также предотвращает изменение стоимости существующих свойств. Однако он не работает рекурсивно, что означает, что дочерние объекты не будут автоматически заморожены и могут быть изменены.
Операции, следующие за замораживанием, будут сбой молча, если код не работает в строгом режиме. Если код находится в строгом режиме, будет TypeError
.
var obj = {
foo: 'foo',
bar: [1, 2, 3],
baz: {
foo: 'nested-foo'
}
};
Object.freeze(obj);
// Cannot add new properties
obj.newProperty = true;
// Cannot modify existing values or their descriptors
obj.foo = 'not foo';
Object.defineProperty(obj, 'foo', {
writable: true
});
// Cannot delete existing properties
delete obj.foo;
// Nested objects are not frozen
obj.bar.push(4);
obj.baz.foo = 'new foo';
Object.seal
Object.seal
предотвращает добавление или удаление свойств объекта. После того как объект был запечатан, его дескрипторы свойств не могут быть преобразованы в другой тип. В отличие от Object.freeze
он позволяет редактировать свойства.
Попытки выполнить эту операцию на закрытом объекте будут терпеть неудачу
var obj = { foo: 'foo', bar: function () { return 'bar'; } };
Object.seal(obj)
obj.newFoo = 'newFoo';
obj.bar = function () { return 'foo' };
obj.newFoo; // undefined
obj.bar(); // 'foo'
// Can't make foo an accessor property
Object.defineProperty(obj, 'foo', {
get: function () { return 'newFoo'; }
}); // TypeError
// But you can make it read only
Object.defineProperty(obj, 'foo', {
writable: false
}); // TypeError
obj.foo = 'newFoo';
obj.foo; // 'foo';
В строгом режиме эти операции будут TypeError
(function () {
'use strict';
var obj = { foo: 'foo' };
Object.seal(obj);
obj.newFoo = 'newFoo'; // TypeError
}());
Создание объекта Iterable
var myIterableObject = {};
// An Iterable object must define a method located at the Symbol.iterator key:
myIterableObject[Symbol.iterator] = function () {
// The iterator should return an Iterator object
return {
// The Iterator object must implement a method, next()
next: function () {
// next must itself return an IteratorResult object
if (!this.iterated) {
this.iterated = true;
// The IteratorResult object has two properties
return {
// whether the iteration is complete, and
done: false,
// the value of the current iteration
value: 'One'
};
}
return {
// When iteration is complete, just the done property is needed
done: true
};
},
iterated: false
};
};
for (var c of myIterableObject) {
console.log(c);
}
Консольный выход
Один
Остановка объекта / распространение (...)
Распространение объектов - это просто синтаксический сахар для Object.assign({}, obj1, ..., objn);
Это делается с помощью оператора ...
:
let obj = { a: 1 };
let obj2 = { ...obj, b: 2, c: 3 };
console.log(obj2); // { a: 1, b: 2, c: 3 };
Поскольку Object.assign
делает мелкое слияние, а не глубокое слияние.
let obj3 = { ...obj, b: { c: 2 } };
console.log(obj3); // { a: 1, b: { c: 2 } };
ПРИМЕЧАНИЕ . Эта спецификация в настоящее время находится на третьем этапе
Дескрипторы и именованные свойства
Свойства являются членами объекта. Каждое именованное свойство представляет собой пару (имя, дескриптор). Имя - это строка, которая разрешает доступ (с использованием точечной нотации object.propertyName
или object['propertyName']
нотации квадратных скобок object['propertyName']
). Дескриптор - это запись полей, определяющих bevahiour свойства при его доступе (что происходит с этим свойством и каково значение, возвращаемое при его доступе). По большому счету, свойство связывает имя с поведением (мы можем думать о поведении как о черном ящике).
Существует два типа именованных свойств:
- Свойство data : имя свойства ассоциировано со значением.
- свойство accessor : имя свойства ассоциировано с одной или двумя функциями доступа.
Демонстрация:
obj.propertyName1 = 5; //translates behind the scenes into
//either assigning 5 to the value field* if it is a data property
//or calling the set function with the parameter 5 if accessor property
//*actually whether an assignment would take place in the case of a data property
//also depends on the presence and value of the writable field - on that later on
Тип свойства определяется его полями дескриптора, и свойство не может быть двух типов.
Дескрипторы данных -
- Обязательные поля:
value
или возможностьwritable
или оба - Дополнительные поля:
configurable
,enumerable
Образец:
{
value: 10,
writable: true;
}
Аксессуар-дескрипторы -
- Обязательные поля:
get
илиset
или оба - Дополнительные поля:
configurable
,enumerable
Образец:
{
get: function () {
return 10;
},
enumerable: true
}
значение полей и их значения по умолчанию
configurable
, enumerable
и writable
: - Все эти ключи по умолчанию имеют значение
false
. -
configurable
true
тогда и только тогда, когда тип этого дескриптора свойства может быть изменен и если свойство может быть удалено из соответствующего объекта. -
enumerable
true
тогда и только тогда, когда это свойство появляется при перечислении свойств на соответствующем объекте. -
writable
true
тогда и только тогда, когда значение, связанное с этим свойством, может быть изменено с помощью оператора присваивания.
get
и set
:
- Эти ключи по умолчанию
undefined
. -
get
- это функция, которая служит в качестве getter для свойства илиundefined
если нет геттера. Возврат функции будет использоваться как значение свойства. -
set
- это функция, которая служит средством настройки для свойства илиundefined
если нет сеттера. Функция получит в качестве единственного аргумента новое значение, которое присваивается свойству.
value
:
- Этот ключ по умолчанию
undefined
. - Значение, связанное с этим свойством. Может быть любым допустимым значением JavaScript (число, объект, функция и т. Д.).
Пример:
var obj = {propertyName1: 1}; //the pair is actually ('propertyName1', {value:1,
// writable:true,
// enumerable:true,
// configurable:true})
Object.defineProperty(obj, 'propertyName2', {get: function() {
console.log('this will be logged ' +
'every time propertyName2 is accessed to get its value');
},
set: function() {
console.log('and this will be logged ' +
'every time propertyName2\'s value is tried to be set')
//will be treated like it has enumerable:false, configurable:false
}});
//propertyName1 is the name of obj's data property
//and propertyName2 is the name of its accessor property
obj.propertyName1 = 3;
console.log(obj.propertyName1); //3
obj.propertyName2 = 3; //and this will be logged every time propertyName2's value is tried to be set
console.log(obj.propertyName2); //this will be logged every time propertyName2 is accessed to get its value
Object.getOwnPropertyDescriptor
Получить описание конкретного свойства в объекте.
var sampleObject = {
hello: 'world'
};
Object.getOwnPropertyDescriptor(sampleObject, 'hello');
// Object {value: "world", writable: true, enumerable: true, configurable: true}
Клонирование объектов
Если вам нужна полная копия объекта (т. Е. Свойства объекта и значения внутри этих свойств и т. Д.), Это называется глубоким клонированием .
Если объект может быть сериализован в JSON, вы можете создать его глубокий клон с помощью комбинации JSON.parse
и JSON.stringify
:
var existing = { a: 1, b: { c: 2 } };
var copy = JSON.parse(JSON.stringify(existing));
existing.b.c = 3; // copy.b.c will not change
Обратите внимание, что JSON.stringify
преобразует объекты Date
в строковые представления ISO-формата, но JSON.parse
не будет преобразовывать строку обратно в Date
.
В JavaScript нет встроенной функции для создания глубоких клонов, и вообще невозможно создать глубокие клоны для каждого объекта по многим причинам. Например,
- объекты могут иметь неперечислимые и скрытые свойства, которые не могут быть обнаружены.
- объекты-получатели и сеттеры не могут быть скопированы.
- объекты могут иметь циклическую структуру.
- свойства функции могут зависеть от состояния в скрытой области.
Предполагая, что у вас есть «хороший» объект, свойства которого содержат только примитивные значения, даты, массивы или другие «приятные» объекты, то для создания глубоких клонов можно использовать следующую функцию. Это рекурсивная функция, которая может обнаруживать объекты с циклической структурой и будет вызывать ошибку в таких случаях.
function deepClone(obj) {
function clone(obj, traversedObjects) {
var copy;
// primitive types
if(obj === null || typeof obj !== "object") {
return obj;
}
// detect cycles
for(var i = 0; i < traversedObjects.length; i++) {
if(traversedObjects[i] === obj) {
throw new Error("Cannot clone circular object.");
}
}
// dates
if(obj instanceof Date) {
copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// arrays
if(obj instanceof Array) {
copy = [];
for(var i = 0; i < obj.length; i++) {
copy.push(clone(obj[i], traversedObjects.concat(obj)));
}
return copy;
}
// simple objects
if(obj instanceof Object) {
copy = {};
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
copy[key] = clone(obj[key], traversedObjects.concat(obj));
}
}
return copy;
}
throw new Error("Not a cloneable object.");
}
return clone(obj, []);
}
Object.assign
Метод Object.assign () используется для копирования значений всех перечислимых собственных свойств из одного или нескольких исходных объектов в целевой объект. Он вернет целевой объект.
Используйте его для назначения значений существующему объекту:
var user = {
firstName: "John"
};
Object.assign(user, {lastName: "Doe", age:39});
console.log(user); // Logs: {firstName: "John", lastName: "Doe", age: 39}
Или создать мелкую копию объекта:
var obj = Object.assign({}, user);
console.log(obj); // Logs: {firstName: "John", lastName: "Doe", age: 39}
Или объедините много свойств из нескольких объектов в один:
var obj1 = {
a: 1
};
var obj2 = {
b: 2
};
var obj3 = {
c: 3
};
var obj = Object.assign(obj1, obj2, obj3);
console.log(obj); // Logs: { a: 1, b: 2, c: 3 }
console.log(obj1); // Logs: { a: 1, b: 2, c: 3 }, target object itself is changed
Примитивы будут завернуты, нулевые и неопределенные будут проигнорированы:
var var_1 = 'abc';
var var_2 = true;
var var_3 = 10;
var var_4 = Symbol('foo');
var obj = Object.assign({}, var_1, null, var_2, undefined, var_3, var_4);
console.log(obj); // Logs: { "0": "a", "1": "b", "2": "c" }
Обратите внимание: только обертки строк могут иметь собственные перечислимые свойства
Используйте его как редуктор: (объединяет массив в объект)
return users.reduce((result, user) => Object.assign({}, {[user.id]: user})
Иерархия свойств объекта
Вы можете получить доступ к каждому свойству, принадлежащему объекту, с помощью этого цикла
for (var property in object) {
// always check if an object has a property
if (object.hasOwnProperty(property)) {
// do stuff
}
}
Вы должны включить дополнительную проверку для hasOwnProperty
потому что объект может иметь свойства, которые унаследованы от базового класса объекта. Не выполнение этой проверки может привести к ошибкам.
Вы также можете использовать функцию Object.keys
которая возвращает массив, содержащий все свойства объекта, а затем вы можете Array.map
этот массив с Array.forEach
функции Array.map
или Array.forEach
.
var obj = { 0: 'a', 1: 'b', 2: 'c' };
Object.keys(obj).map(function(key) {
console.log(key);
});
// outputs: 0, 1, 2
Получение свойств объекта
Характеристики свойств:
Свойства, которые могут быть извлечены из объекта, могут иметь следующие характеристики,
- перечислимый
- Non-Enumerable
- своя
При создании свойств с использованием Object.defineProperty (ы) мы могли бы установить его характеристики, кроме «own» . Свойства, доступные на прямом уровне не на уровне прототипа ( __proto__
) объекта, называются собственными свойствами.
И свойства, которые добавляются в объект без использования Object.defindProperty(ies)
будут иметь его перечислимой характеристики. Это означает, что это считается истиной.
Цель перечислимости:
Основная цель установки перечислимых характеристик для свойства заключается в том, чтобы обеспечить доступность конкретного свойства при его извлечении из его объекта с использованием различных программных методов. Эти различные методы будут обсуждаться глубоко ниже.
Методы получения свойств:
Свойства объекта можно получить следующими способами:
for..in
loopЭтот цикл очень полезен при извлечении перечислимых свойств из объекта. Кроме того, этот цикл будет извлекать перечислимые собственные свойства, а также будет выполнять тот же поиск, пройдя цепочку прототипов, пока не увидит прототип как нуль.
//Ex 1 : Simple data var x = { a : 10 , b : 3} , props = []; for(prop in x){ props.push(prop); } console.log(props); //["a","b"] //Ex 2 : Data with enumerable properties in prototype chain var x = { a : 10 , __proto__ : { b : 10 }} , props = []; for(prop in x){ props.push(prop); } console.log(props); //["a","b"] //Ex 3 : Data with non enumerable properties var x = { a : 10 } , props = []; Object.defineProperty(x, "b", {value : 5, enumerable : false}); for(prop in x){ props.push(prop); } console.log(props); //["a"]
Эта функция была представлена как часть EcmaScript 5. Она используется для извлечения перечислимых собственных свойств объекта. До его выпуска люди использовали для извлечения собственных свойств из объекта, комбинируя
for..in
loop иObject.prototype.hasOwnProperty()
.//Ex 1 : Simple data var x = { a : 10 , b : 3} , props; props = Object.keys(x); console.log(props); //["a","b"] //Ex 2 : Data with enumerable properties in prototype chain var x = { a : 10 , __proto__ : { b : 10 }} , props; props = Object.keys(x); console.log(props); //["a"] //Ex 3 : Data with non enumerable properties var x = { a : 10 } , props; Object.defineProperty(x, "b", {value : 5, enumerable : false}); props = Object.keys(x); console.log(props); //["a"]
Эта функция будет извлекать как перечислимые, так и неперечислимые собственные свойства объекта. Он также был выпущен в составе EcmaScript 5.
//Ex 1 : Simple data var x = { a : 10 , b : 3} , props; props = Object.getOwnPropertyNames(x); console.log(props); //["a","b"] //Ex 2 : Data with enumerable properties in prototype chain var x = { a : 10 , __proto__ : { b : 10 }} , props; props = Object.getOwnPropertyNames(x); console.log(props); //["a"] //Ex 3 : Data with non enumerable properties var x = { a : 10 } , props; Object.defineProperty(x, "b", {value : 5, enumerable : false}); props = Object.getOwnPropertyNames(x); console.log(props); //["a", "b"]
Разнообразный :
Ниже приведена методика получения всех свойств (собственных, перечислимых, неперечислимых, всех прототипов) свойств объекта,
function getAllProperties(obj, props = []){
return obj == null ? props :
getAllProperties(Object.getPrototypeOf(obj),
props.concat(Object.getOwnPropertyNames(obj)));
}
var x = {a:10, __proto__ : { b : 5, c : 15 }};
//adding a non enumerable property to first level prototype
Object.defineProperty(x.__proto__, "d", {value : 20, enumerable : false});
console.log(getAllProperties(x)); ["a", "b", "c", "d", "...other default core props..."]
И это будет поддерживаться браузерами, которые поддерживают EcmaScript 5.
Преобразование значений объекта в массив
Учитывая этот объект:
var obj = {
a: "hello",
b: "this is",
c: "javascript!",
};
Вы можете преобразовать его значения в массив, выполнив:
var array = Object.keys(obj)
.map(function(key) {
return obj[key];
});
console.log(array); // ["hello", "this is", "javascript!"]
Итерация над объектами - Object.entries ()
Предложенный Object.entries()
возвращает массив пар ключ / значение для данного объекта. Он не возвращает итератор, такой как Array.prototype.entries()
, но массив, возвращаемый Object.entries()
может быть повторен независимо.
const obj = {
one: 1,
two: 2,
three: 3
};
Object.entries(obj);
Результаты в:
[
["one", 1],
["two", 2],
["three", 3]
]
Это полезный способ итерации по парам ключ / значение объекта:
for(const [key, value] of Object.entries(obj)) {
console.log(key); // "one", "two" and "three"
console.log(value); // 1, 2 and 3
}
Object.values ()
Метод Object.values()
возвращает массив собственных значений перечислимого свойства данного объекта в том же порядке, что и в цикле for for ... in (разница заключается в том, что цикл for-in перечисляет свойства в цепочке прототипов также).
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']
Замечания:
Для поддержки браузера обратитесь к этой ссылке