Объекты имеют более общую природу: они являются неупорядоченными наборами произвольных значений с доступом по ключу. Иначе говоря, вы обращаетесь к элементам по строковому имени (ключу или свойству) вместо числовой позиции (как в случае с массивами).
JS не предоставляет механизм проверки структурного равенства объектных значений — только проверку тождественности ссылок. Чтобы выполнить проверку структурного равенства, придется реализовать проверки самостоятельно.
JS не определяет === как структурное равенство для объектных значений. Вместо этого === использует для объектных значений тождественное равенство.
В JS все объектные значения хранятся по ссылке (см. приложение А, «Значения и ссылки»), присваиваются и передаются копированием ссылки, а в контексте нашего текущего обсуждения сравниваются по ссылочному (тождественному) равенству. Пример:
var x = [ 1, 2, 3 ];
// Присваивание выполняется копированием ссылки,
// поэтому y ссылается на *тот же* массив, что и x,
// а не на его новую копию.
var y = x;
y === x; // true
y === [ 1, 2, 3 ]; // false
x === [ 1, 2, 3 ]; // false
Для сравнения NaN используется специальная функция Number.isNaN(..), которая возвращает правдивый результат. Для сравнения -0 лучше использовать функцию Object.is(..), которая также говорит правду. При желании Object.is(..) также можно использовать для правдивых проверок NaN.
Оператор === сознательно проектировался так, чтобы возвращал ложную информацию для двух специальных значений: NaN и -0.
Пример:
NaN === NaN; // false
0 === -0; // true
Тип сравниваемых значений учитывается во всех сравнениях значений в JS, не только в операторе ===. А конкретнее, === запрещает любые преобразования типов при сравнении, тогда как при сравнениях JS они допустимы.
Проверка равенства оператором === часто описывается как проверка как значения, так и типа.
В JS смысл функции расширяется до другого взаимосвязанного термина: «процедура». Процедура представляет собой набор команд, который может вызываться один или несколько раз, может получать входные данные и может возвращать одно или несколько значений.
function hello(myName) {
console.log(`Hello, ${ myName }.`);
}
hello("Kyle");
// Hello, Kyle.
Идентификатор hello создается во внешней области видимости и при этом автоматически связывается со ссылкой на функцию. Но именованный параметр myName создается только внутри функции, и поэтому доступ к нему возможен только в области видимости функции. В целом hello и myName обычно ведут себя как объявленные ключевым словом var.
Также для объявления переменной может использоваться конструкция catch:
try {
someError();
}
catch (err) {
console.log(err);
}
Переменная err имеет блоковую область видимости, которая существует только внутри конструкции catch, как если бы она была объявлена ключевым словом let.
Если вы будете использовать const только с примитивными типами, вы сможете избежать любой путаницы с повторным присваиванием (запрещенным) и модификацией (разрешенной). Это самый надежный и лучший способ использования const.