Объекты

Примитивы

Объекты

Типы данных JS

  • string
  • number
  • boolean
  • null
  • undefined
  • symbol
  • object
let user = new Object(); // синтаксис "конструктор объекта"
let user = {};  // синтаксис "литерал объекта"

Создание объекта

let user = {
  key1: "Карточка Никиты",
  key2: "Карточка Игоря",
  key3: "Карточка Васьки"
};  

Создание объекта

console.log(user.key1);

Карточка Никиты

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

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

// это вызовет синтаксическую ошибку
user.likes birds = true;

Так происходит, потому что точка требует, чтобы ключ был именован по правилам именования переменных. То есть не имел пробелов, не начинался с цифры и тд

Для таких случаев существует альтернативный способ доступа к свойствам через квадратные скобки. Такой способ сработает с любым именем свойства:

let user = {};

// присваивание значения свойству
user["likes birds"] = true;

// получение значения свойства
alert(user["likes birds"]); // true

// удаление свойства
delete user["likes birds"];
let key = "likes birds";

// то же самое, что и user["likes birds"] = true;
user[key] = true;

Квадратные скобки также позволяют обратиться к свойству, имя которого может быть результатом выражения. Например, имя свойства может храниться в переменной:

Внимание. КОД!

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

let key = prompt("Что вы хотите узнать о user?", "name");

// доступ к свойству через переменную
alert( user[key] ); // John (если ввели "name")
let key = "name";
alert( user.key ); // undefined

Запись «через точку» такого не позволяет:

let user = {};

alert( user.name === undefined );

Проверка существования свойства

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

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

alert( "age" in user ); // true, user.age существует
alert( "blabla" in user ); // false, user.blabla не существует

Обычно строгого сравнения "=== undefined" достаточно для проверки наличия свойства. Но есть особый случай, когда оно не подходит, и нужно использовать "in".

Это когда свойство существует, но содержит значение undefined:

let obj = {
  test: undefined
};

alert( obj.test === undefined); // true свойства не существует!

alert( "test" in obj ); // true, свойство существует!

Цикл «for…in»

Для перебора всех свойств объекта используется цикл for..in. Этот цикл отличается от изученного ранее цикла for(;;).

for (let key in object) {
  // тело цикла выполняется для каждого свойства объекта
}
let user = {
  name: "John",
  age: 30,
  isAdmin: true
};

for (let key in user) {
  // ключи
  alert( key );  // name, age, isAdmin
  // значения ключей
  alert( user[key] ); // John, 30, true
}

Копирование по ссылке

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

Примитивные типы: строки, числа, логические значения – присваиваются и копируются «по значению».

let message = "Hello!";
let phrase = message;

В результате мы имеем две независимые переменные, каждая из которых хранит строку "Hello!".

Объекты ведут себя иначе...

Переменная хранит не сам объект, а его «адрес в памяти», другими словами «ссылку» на него.

let user = {
  name: "John"
};

Когда переменная объекта копируется – копируется ссылка, сам же объект не дублируется.

let user = { name: "John" };

let admin = user; // копируется ссылка

Теперь у нас есть две переменные, каждая из которых содержит ссылку на один и тот же объект:

Мы можем использовать любую из переменных для доступа к ящику и изменения его содержимого:

let user = { name: 'John' };

let admin = user;

admin.name = 'Pete'; // изменено по ссылке

alert(user.name); // 'Pete', видны по ссылке в "user"

Сравнение объектов

let a = {};
let b = a; // копирование по ссылке

// обе переменные ссылаются на один и тот же объект
alert( a === b ); // true
alert( a === b ); // true
let a = {};
let b = {}; // два независимых объекта

alert( a === b ); // false

Два объекта равны только в том случае, если это один и тот же объект.

В примере ниже два разных объекта не равны, хотя и оба пусты:

кінець, хлопці

Объекты

By Techno School

Объекты

  • 23