Когда использовать оператор двойного или тройного равенства?

При сравнении значений в JavaScript вы можете встретить оператор равенства, состоящий из двух или трех символов равенства. Например:

== or ===

По большей части эти два могут использоваться как взаимозаменяемые, но есть важное различие, которое необходимо сделать в зависимости от того, как вы хотите, чтобы сравнение оценивалось. Различие между этими двумя символами сводится к типам сравниваемых значений.

JavaScript имеет шесть примитивных типов данных, включаяstring, number, undefined, null, boolean и symbol. Хотя сейчас мы не будем уделять слишком много внимания специфике каждого типа, этот пост может дать ценную информацию, если вы захотите узнать больше. Каждое значение для сравнения имеет свой тип, соответствующий тому, какой тип данных представляет собой значение.

Например, если var x = 'hello world', вы можете подтвердить, что типом «x» является string. Попробуйте следующий код в консоли:

var x = 'hello world'
console.log(typeof x)
> string

Так почему же type элемента имеет значение, когда дело доходит до решения, использовать ли оператор двойного или тройного равенства?

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

var x = '1'
var y = 1
console.log(x === y)
> false

Что произойдет, если вместо этого использовать оператор двойного равенства?

var x = '1'
var y = 1
console.log(x == y)
> true

Почему так происходит? Что ж, двойной символ равенства выполняет так называемое приведение типа перед фактическим сравнением двух значений. Это означает, что перед сравнением значения преобразуются в один и тот же тип. В приведенном выше случае x (строка) была принудительно преобразована в 1 (число) перед сравнением с y (число 1). Полученное сравнение доказывает true, потому что 1 === 1.

Для получения дополнительной информации о том, что определяет, какой элемент будет принудительно приведен, ознакомьтесь с этой сравнительной таблицей в документации MDN.

Когда какой использовать?

Если вы хотите сравнить значения и их типов, вам следует использовать символ тройного равенства. Если вы хотите сравнить значения без учета типа, используйте двойное равенство.

Зачем вам сравнивать два значения и игнорировать типы? Я могу вспомнить один пример, связанный с элементом select в HTML. Значения выбора по сути являются типом string. Предположим, вы отображаете список дел в виде вариантов в элементе select ниже.

var todos = [{id: 1, title: 'item 1', subItem: 'a'}, {id: 2, title: 'item 1', subItem: 'b'}, {id: 3, title: 'item 2', subItem: 'a'},...]

Каждому option можно присвоить id объекта в качестве значения. Когда вы выбираете параметр, типом для e.target.value будет string, а не number. Теперь, если вы хотите сохранить объект, соответствующий выбранному id, найти этот элемент по id с помощью оператора тройного равенства не получится. Поскольку тройка равно сравнивает и значение, и тип, e.target.value не будет соответствовать ни одному из идентификаторов объектов. Поместите приведенный ниже код в свою консоль:

var todos = [{id: 1, title: 'item 1', subItem: 'a'}, {id: 2, title: 'item 1', subItem: 'b'}, {id: 3, title: 'item 2', subItem: 'a'}]
var todo = todos.find(x=>x.id === '1')
console.log(todo)
> undefined

Теперь вы можете выполнить x=>x.id === parseInt(e.target.value), который превратит выбранное значение в число перед использованием его в функции find. Или вы можете просто использовать оператор двойного равенства.

var todos = [{id: 1, title: 'item 1', subItem: 'a'}, {id: 2, title: 'item 1', subItem: 'b'}, {id: 3, title: 'item 2', subItem: 'a'}]
// Where e.target.value is '1'
var todo = todos.find(x=>x.id == '1')
console.log(todo)
> {id: 1, title: "item 1", subItem: "a"}

Принуждение типа с оператором Not

Приведение типов, наблюдаемое с двойным равенством, также выполняется при использовании одиночного оператора not (!=) по сравнению с двойным оператором not (!==). Скопируйте приведенный ниже код и вставьте его в консоль:

var x = '1'
var y = 1
console.log(x != y)
> false

Если вы хотите сравнить значение и тип значения, используйте оператор double not:

var x = '1'
var y = 1
console.log(x !== y)
> true

Резюме

Знание того, когда использовать два или три символа равенства в операторе равенства, может показаться запутанным, особенно потому, что они могут использоваться как взаимозаменяемые. Я надеюсь, что эта статья помогла вам понять, когда нужно быть осторожным с количеством используемых символов равенства. Спасибо за прочтение!

Обновите бесплатную подписку на Medium до платной, и всего за 5 долларов в месяц вы получите неограниченное количество рассказов от тысяч писателей без рекламы. Это партнерская ссылка, и часть вашего членства помогает мне получать вознаграждение за контент, который я создаю. Спасибо!

использованная литература