Поиск…


Синтаксис

  • 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

5

Object.keys(obj) возвращает массив ключей данного объекта.

var obj = {
    a: "hello",
    b: "this is",
    c: "javascript!"
};

var keys = Object.keys(obj);

console.log(keys); // ["a", "b", "c"]

Неглубокое клонирование

6

Функция 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

5

Это позволяет нам определить свойство в существующем объекте, используя дескриптор свойства.

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

Свойство только для чтения

5

Используя дескрипторы свойств, мы можем сделать свойство только для чтения, и любая попытка изменить его значение будет терпеть неудачно, значение не будет изменено, и никакая ошибка не будет выбрана.

writable свойство в дескрипторе свойства указывает, может ли это свойство быть изменено или нет.

var a  = { };

Object.defineProperty(a, 'foo', { value: 'original', writable: false });

a.foo = 'new';

console.log(a.foo);

Консольный выход

оригинал

Неперечислимое свойство

5

Мы можем избежать того, чтобы свойство отображалось 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]);
}

Консольный выход

шоу

Заблокировать описание свойства

5

Дескриптор свойства может быть заблокирован, поэтому к нему не могут быть внесены изменения. По-прежнему можно будет использовать свойство обычно, назначая и извлекая значение из него, но любая попытка переопределить его вызовет исключение.

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 (получить и установить)

5

Рассматривайте свойство как комбинацию из двух функций: одну для получения значения из нее, а другую для установки значения в ней.

Свойство 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

5

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

5

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

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

Консольный выход

Один

Остановка объекта / распространение (...)

7

Распространение объектов - это просто синтаксический сахар для 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 свойства при его доступе (что происходит с этим свойством и каково значение, возвращаемое при его доступе). По большому счету, свойство связывает имя с поведением (мы можем думать о поведении как о черном ящике).

Существует два типа именованных свойств:

  1. Свойство data : имя свойства ассоциировано со значением.
  2. свойство 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}

Клонирование объектов

Если вам нужна полная копия объекта (т. Е. Свойства объекта и значения внутри этих свойств и т. Д.), Это называется глубоким клонированием .

5,1

Если объект может быть сериализован в 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 потому что объект может иметь свойства, которые унаследованы от базового класса объекта. Не выполнение этой проверки может привести к ошибкам.

5

Вы также можете использовать функцию 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) будут иметь его перечислимой характеристики. Это означает, что это считается истиной.

Цель перечислимости:

Основная цель установки перечислимых характеристик для свойства заключается в том, чтобы обеспечить доступность конкретного свойства при его извлечении из его объекта с использованием различных программных методов. Эти различные методы будут обсуждаться глубоко ниже.

Методы получения свойств:

Свойства объекта можно получить следующими способами:

  1. 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"]
    
  2. Object.keys()

    Эта функция была представлена ​​как часть 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"]
    
  1. Object.getOwnProperties()

    Эта функция будет извлекать как перечислимые, так и неперечислимые собственные свойства объекта. Он также был выпущен в составе 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 ()

8

Предложенный 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 ​​()

8

Метод Object.values() возвращает массив собственных значений перечислимого свойства данного объекта в том же порядке, что и в цикле for for ... in (разница заключается в том, что цикл for-in перечисляет свойства в цепочке прототипов также).

var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']

Замечания:

Для поддержки браузера обратитесь к этой ссылке



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow