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