понедельник, 22 октября 2018 г.

Понимание ==, === и typeof в JavaScript


Все мы знаем, что == и === - это операторы сравнения в JavaScript. Но == - это оператор равенства, он конвертирует операнды если они не одного типа, прежде чем осуществлять сравнение. В то же время === называется оператором идентичности или строгого равенства, он возвращает true если операторы строго равны, т.е. они одинакового типа с одинаковым значением.
Оператор сравнения (==) сравнивает только значения переменных.
i.e var x = 20;
var y = 20;
console.log( x == y );
// Вернет: true. Потому что значения идентичны
Примечание: == ведет себя также как и === только в ситуации когда переменные одинакового типа.
Из предыдущего примера var x и y имеют одинаковый численный тип поэтому здесь мы может опустить строгое равенство (===).
e.g 1. Var x1 = 30;
var x2 = “chisom”;
console.log(x1 == x2);
//Вернет: false. Изза того что у переменных разный, использовать == здесь не совсем правильно.
e.g 2. == никогда не заменить ===, потому что в примере ниже попробует преобразовать значение прежде чем делать сравнение, и в некоторых случаях преобразует к другому типу.
var a = 5;
var c = “5”;
console.log (a == c);
//Вернет: true : потому что наши переменные были преобразованы в целочисленные 5, перед проверкой значений на равнество что сейчас true.
Причины когда вы захотите использовать === вместо ==
  1. Безопаснее использовать === в большинстве случаев, и если вы собираетесть использовать этот оператор, то в некоторых случаях это будет правильнее использовать его везде.
  2. Вы можете каждый раз задавать себе вопрос проверка на какое равенство вам нужна, а можете просто всегда использовать ===
  3. В третьих – более сложный сценарий использования == вместо – это когда вам необходимо сравенение с возможным преобразованием (например если вы хотите проверить 0 и ‘’ и хотите получить в результате сравения false). В таких случаях кстати можно использовать if(! empty_str) вместо (empty_str == false).


Оператор Typeof
Из MDN: “Оператор typeof возвращает строку которая возвращает тип вычисляемого операнда”.
Как им пользоваться?
Поскольку это унарный оператор, то операнд следует за ним. И больше ничего не нужно.
typeof 5 //число
typeof “chisom” // строка
Оператор typeof – это не функция. Вы можете добавить скобки и размещать операнд внутри них, но они будут использоваться для группировки а не как вызов функции. На самом деле вы можете декорировать операнд как угодно соблюдая при этом правила синтаксиса языка.
e.g. typeof(4) // число
typeof(2+3)//  число
typeof не очень разборчивый оператор. Если вы применяете его для объекта у которого тип не является функцией, то он возвращает «объект». Он не разделяет на встроеные объекты или кастомные. Вы это можете проверить в MDN.
Но это то место которое вызывает вопросы:
//Первая проверка типа работает хорошо
var person = {
 getFirstName: function () {
 console.log(‘chisom’);
 }
};
if (typeof person === ‘object’) {
 person.getFirstName(); //
этот код работает так как мы и ожидаем
}
//Вторая проверка типа бросает исключение.
var person = [];
if (typeof person === ‘object’) {
person.getFirstName(); //person.getFirstName не функция
}
Во второй части примера вы можете видет что typeof падает изза попытки проверить является ли объект person простым объектом, что на самом деле не так.
В завершение можно чказать что оператор typeof немного странный. Если вы не знаете наверняка как им пользоваться, просто не пользуйтесь им, иначе можете просто посмотреть как он используется с помощью Object.prototype.toString.call();