Разница между "=", "==" и "==="


#1

Итак. “=” - это приравнивание. “==” - это сравнение с приведением к одному типу, а “===” - сравнение без приведения к одному типу. Что значит это “приведение к одному типу”?


#2

Приведение к одному типу данных - строчному, числовому, логическому и т.д.


#3

Уж лучше оператор присваивания, так ближе к сути.

У нас есть две переменные, нам нужно сравнить их значения.
Оператор сравнения (==) перед сравнением попытается преобразовать значения этих переменных так, чтобы они представляли один тип данных. Банально, но сравнивать разные типы данных, например число и строку, все равно что сравнивать рояль и банан - совсем разные сущности. Поэтому, компилятор сначала пытается сделать их единообразными - приведет к одному типу и только потом проведет сравнение.

Оператор строгого сравнения (===) действует наоборот - сначала проверяет тип данных переменных, и приступает непосредственно к сравнению только тогда, если они заведомо идентичны. То есть, процесс приведения к одному типу отсутствует, оператор строгого сравнения требует, чтобы мы однозначно сравнивали только строки со строками, числа с числами и объекты с объектами.

JS - язык с динамической типизацией. Это означает, что тип данных, которые хранит переменная, определяется “автоматически” в момент, когда мы присваиваем переменной значение - число, строку, объект etc. В противоположность динамической существует статическая типизация в других языках программирования - это когда перед присваиванием значения мы указываем, что переменная должна хранить определенный и только тот, указанный нами тип данных.


#4

в php мне в 90% хватает “==” когда точно знаешь что с чем сравниваешь. Но когда данные приходят со стороны, например из бд, файла или get/post параметров то преобразование типов может с маленькой, но вероятностью тебя подставить.
Например если без предварительной валидации входящих данных в условии сравнивать if (data == true){} где мы подразумеваем что data существует, а data любое число, то в случае если data равна 0 (строка или число, не важно), то произойдет неожиданное НЕ выполнение условия, дальнейшие ошибки которого разгребать можно будет долго.

“===” с одной стороны решает такие логические проблемы, с другой создает дополнительные строки кода для валидации. Хотя изначально во всех языках так и было

В моем понимании, тут надо просто уметь балансировать между лаконичностью кода и возможных подводных камней).

И я не очень понимаю esLint и другие инструменты и требования академии которые прям ругаются на то что ты пишешь не под их копирку. Это должна быть проблема самого языка, а не разработчиков. Python вообще гениальный язык - если ты не делаешь отступы, у тебя программа просто работать не будет)). Гибкость гибкости рознь - сегодня столько костылей для js что времени не хватит всем этом бардаке разобраться, разобрался в одном, завтра уже новый костыль появился и т.д.


#5

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


#6

а еще с eslinto’m можно получить кучу геморроя, который кстати даже не является частью рекомендаций и черновиков в спецификации. Просто какие то люди решили за всех что так будет хорошо всем, академия и многие другие это скушали. А то что eslint ругается даже на alert который еще с 90х был частью всех браузеров и нативным api js, никого не смущает похоже.
Да конечно разобравшись видим что alert не родная функция js, браузерная. НО этим людям кто писал, видимо вообще все равно что js это в 95% браузерный язык и они как минимум в свою долбанную спецификацию могли бы включить поддержку браузеров по умолчанию.


#7

Не надо чушь нести, eslint конфигурируется как душе угодно. И все исключения для используемой вами конфигурации легко прописать. Но можно пойти дальше и найти тот конфиг, который вам будет нравится или написать свой