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

Объект может быть создан с фигурными скобками «{}» с n необязательным списком свойств. Свойство представляет собой пару Ключ и значение (ключ: значение)

Создание одного объекта по синтаксису

let user = new Object(); // "object constructor" syntax
let user = {};  // "object literal" syntax

Литерал объекта

let user = {     
  name: "John",  
  age: 30        
};

В этом объекте «имя» — ключ, ключ — строка, а «джон» — значение, значение может быть любым. Во втором свойстве значение равно Number.

Значения свойств доступны с использованием записи через точку:

console.log( user.name ); // John
console.log( user.age ); // 30

Мы можем добавлять и удалять свойства

user.isAdmin = true;
delete user.age

Если мы хотим добавить имена свойств, состоящие из нескольких слов, они должны быть заключены в кавычки.

let user = {     
  name: "John",  
  age: 30 ,
"Pokey the Penguin" : "Steve Havelka" 
"sachin god of cricke" : true     
};

Для свойств, состоящих из нескольких слов, «точечный» доступ не работает. Затем мы использовали квадратные скобки.

Квадратных скобках

user.likes animals= true // syntax error

Приведенное выше уравнение дает синтаксическую ошибку, потому что считает, что мы обращаемся к user.likes, неожиданному animals . Точка требует, чтобы ключ был действительным идентификатором переменной. Это подразумевает: не содержит пробелов, не начинается с цифры и не включает специальные символы.

Существует альтернативная «нотация квадратных скобок», которая работает с любой строкой:

user['likes animals']= true

Квадратные скобки намного мощнее, чем запись через точку. Они допускают любые имена свойств и переменных. Но они также более громоздки для написания. Поэтому в большинстве случаев, когда имена свойств известны и просты, используется точка. А если нам нужно что-то более сложное, то переходим на квадратные скобки.

Ключ и значение одинаковы, тогда мы можем написать сокращенное свойство.

let user = {
  name,  // same as name:name
  age: 30
};

Ограничение имен свойств

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

Зарезервированные слова разрешены в качестве имен свойств.

Переменная не может иметь имя, равное одному из зарезервированных для языка слов, таких как «for», «let», «return» и т. д. Но для свойства объекта такого ограничения нет.

let obj = {
  for: 1,
  let: 2,
  return: 3
};

console.log( obj.for + obj.let + obj.return );

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

let obj = {};
obj.__proto__ = 5; // assign a number
alert(obj.__proto__); // [object Object]

[[Прототип]]

В JavaScript объекты имеют специальное скрытое свойство [[Prototype]], которое либо равно null, либо ссылается на другой объект. Этот объект называется «прототипом».

Когда мы хотим прочитать свойство из object, а оно отсутствует, JavaScript автоматически берет его из прототипа. В программировании такое явление называется «прототипное наследование».

Свойство [[Prototype]] является внутренним и скрытым, но существует множество способов его установки. Один из них — использовать специальное имя __proto__.

let animal = {
  eats: true
};
let rabbit = {
  jumps: true
};
rabbit.__proto__ = animal

Если мы ищем свойство в rabbit, а оно отсутствует, JavaScript автоматически берет его из animal.

alert( rabbit.eats ); // true 
alert( rabbit.jumps ); // true

«внутренний» оператор

Также существует специальный оператор "in" для проверки существования свойства.

"key" in object
let user = { name: "John", age: 30 };

alert( "age" in user ); // true, 
alert( "bala" in user ); // false,

Цикл for…in

Для обхода всех ключей объекта существует специальная форма цикла: for..in. Это полностью отличается от конструкции for(;;), которую мы изучали ранее.

`for (key in object) {}

let user = {
  name: "Sam",
  age: 30,
  isUser: true
};
for (let key in user) {
  alert( key );  // name, age, isUser
  alert( user[key] ); // Sam, 30, true
}

Копирование объектов, ссылки

Javascript предоставляет два типа типов данных: примитивные данные и непримитивные типы данных.

Объект является непримитивным типом данных. Непримитивные значения — это изменяемые типы данных. Значение можно изменить после его создания. Объекты не сравниваются по стоимости. Два объекта равны, только если они являются одним и тем же объектом.

var a= {} 
var b=a // true

Если два объекта имеют одинаковое значение и свойства, они не являются строго равными.

{} == {} //false
{} === {} // false
var a = {b: 'ball'}
var c = {b: 'ball'}
a == b // false

Объекты назначаются и копируются по ссылке. Другими словами, переменная хранит не «значение объекта», а «ссылку» (адрес в памяти) на значение.