В JavaScript очень часто ===
предпочтительнее ==
, и не зря. С ==
JavaScript будет «пытаться» сопоставить сравниваемые элементы, и это на удивление сильно. Взгляните на некоторые из этих сравнений, которые в JavaScript считаются равными при использовании ==
.
JavaScript > 5 == "5" true > 1 == true true > "" == false true
Может быть, это только я, но я думаю, что разумный человек, незнакомый с JavaScript, найдет приведенные выше результаты удивительными. Тогда не удивительно, что ==
, как правило, не приветствуются в JavaScript.
С другой стороны, в Elixir double equals==
используется довольно часто, и его не особо обескураживают, как в JavaScript. По крайней мере, таково мое впечатление. Вероятно, это связано с тем, что оператор double equals ==
operator строже, чем в JavaScript, и не подвержен таким же сомнительным совпадениям. В Elixir все примеры дают false
.
Elixir > 5 == "5" false > 1 == true false > "" == false false
Единственное отличие, которое я обнаружил в Elixir при замене double equals ==
на тройное equals===
, заключается в том, что числа больше не считаются равными, если они относятся к разным типам.
Elixir iex(6)> 1 == 1.0 true iex(7)> 1 === 1.0 false
Как вы можете видеть в приведенном выше примере, функция triple equals считает два числа разными, если они относятся к разным типам, даже если числовое значение одинаково.
Вообще говоря (могут быть исключения с такими вещами, как типизированные массивы) JavaScript не делает различий между числовыми типами, все они просто числа, поэтому выполнение приведенного выше примера в JavaScript с использованием тройного равенства дает true
.
JavaScript > 1 === 1.0 true
Как видите, для этого сравнения тройное равенство в JavaScript ведет себя как двойное равенство в Эликсире. Честно говоря, поведение, показанное в приведенном выше примере, больше указывает на то, как числовые типы работают в JavaScript, чем на то, как работает оператор ===
.
Я думаю, что хорошее практическое правило - помнить, что в большинстве случаев ===
в JavaScript эффективно ведет себя так же, как ==
в Elixir, и наоборот. Это чрезмерное упрощение, но, вероятно, хорошее общее правило, о котором следует помнить.
Конечно, это обсуждение актуально только для примитивных значений. Когда мы переходим к картам / объектам и спискам / массивам, Эликсир и Javascript сильно отличаются, независимо от количества используемых нами знаков равенства. Это другая история.