Объекты


Создали объект:

var obj = {};

Можно и так:

var obj = new Object();

но это долго и бессмысленно

Создали свойство объекта: пару ключ - значение:

obj.name = "John";

Здесь name - имя свойства, "John" - значение свойства

Создали ещё одно свойство:

obj.age = 22;

Изменили свойство name, переписали его значение:

obj.name = "Bill";

Удалили свойство name

delete obj.name;

Проверили, есть ли у объекта свойство с именем name

"name" in obj; // false

...а со свойством age?

"age" in obj // true

Проверить можно было и проще:

obj.name // undefined
obj.age // 22

Или так

obj.name === undefined // true - свойства нет
obj.age === undefined // false - свойство есть

Работает для всех случаев, кроме тех, когда кто-то прямо не назначил свойству объекта значение undefined. Не надо так

Ещё один способ доступа к значению свойства - квадратные скобки

obj.name // "Bill";
obj["name"] // "Bill"; 

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

Ещё одна причина использовать квадратные скобки, если имя свойства  записано в переменную

Например, так работать будет

var person = {};
person.age = 25;
var key = 'age';
person[key] // 25

а так - нет

person.key // undefined

Объект можно сразу создать вместе со свойствами:

var person = {
    name: "Bill",
    age: 25
};

Имена свойств могут быть как в кавычках, так и без них.
Значением свойства может быть другой объект.

Перебор свойств

Вывести значения всех свойств объекта или сделать с ними что-то ещё позволяет конструкция

for (var key in obj) {
    /* ... делать что-то с obj[key] ... */
}

Здесь key - имя свойства, obj[key] - его значение. Такой цикл переберёт все свойства объекта obj. Кстати, называть переменную key не обязательно. Это просто традиция, но имя переменной может быть любым.

Как узнать количество свойств в объекте

Встроенного метода для этого нет.
Можно написать функцию

var counter = 0;
for (var key in obj) {
    counter++;
}

counter;

Сounter покажет количество свойств.

Можно сделать проще:

Object.keys(obj).length

Порядок перебора свойств

Если свойства не цифровые, то они перебираются в том порядке, в каком назначались

Для свойств, имена которых цифры, перебираться будут по порядку увеличения чисел. Чтобы этого избежать, перед именем свойства допишем знак +. На число он не повлияет, но js перестанет считать его числом и не будет сортировать как число. Чтобы потом вывести числовое свойств, пишем + повторно.

Пример

var codes = {
  "7": "Россия",
  "38": "Украина",
  "1": "США"
};

for (var code in codes) {
  var value = codes[code];
 

  alert( code + ": " + value ); 

}

Так выведет

"1": "США"
"38": "Украина",
"7": "Россия"


var codes = {
  "+
7": "Россия",
  "+
38": "Украина",
  "+
1": "США"
};

for (var code in codes) {
  var value = codes[code];
 
code = +code // преобразуем строку в число


  alert( code + ": " + value ); 

}

Выведет

"7": "Россия",
"38": "Украина",
"1": "США"

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

Если нужно получить два одинаковых объекта, их можно клонировать

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

var user = {
  name: "Вася",
  age: 30
};

var clone = {}; // новый пустой объект

// скопируем в него все свойства user
for (var key in user) {
  clone[key] = user[key];
}

// теперь clone - полностью независимая копия
clone.name = "Петя"; // поменяли данные в clone

alert( user.name ); // по-прежнему "Вася"

При «раскрытии» свойств объекта в консоли – браузер всегда выводит их текущие (на момент раскрытия) значения.