Ответ
Оператор == (нестрогое равенство) сравнивает значения с приведением типов (type coercion). Если типы разные, JavaScript пытается преобразовать их к общему типу перед сравнением.
Оператор === (строгое равенство) проверяет равенство без приведения типов. Значения должны быть одинаковыми и типы данных должны совпадать.
Примеры:
console.log(5 == '5'); // true (строка '5' преобразуется в число 5)
console.log(5 === '5'); // false (разные типы: number vs string)
console.log(null == undefined); // true (специальное правило)
console.log(null === undefined); // false (разные типы)
console.log(0 == false); // true (false преобразуется в 0)
console.log(0 === false); // false (number vs boolean)
Практическое правило: Почти всегда используйте ===. Строгое сравнение предсказуемо и предотвращает ошибки из-за неявного приведения типов, что соответствует принципам написания чистого и надежного кода.
Ответ 18+ 🔞
А, слушай, вот эта тема про равенства в JS — это просто пиздец, где новички вечно путаются и стреляют себе в ногу. Сейчас разжую, как есть.
Вот смотри, есть у нас два оператора, которые выглядят почти одинаково, но ведут себя как две разные суки. Один — ==, типа "похоже на братана". Другой — ===, типа "я тебе не братан, я тебе родной брат, блядь".
== (нестрогое равенство, оно же "похоже на братана")
Этот оператор — тот ещё распиздяй. Он смотрит на значения и говорит: "Ну, они вроде как одинаковые, давайте я тут типы по-быстрому приведу, чтобы не париться". Это называется type coercion — приведение типов на лету, хуле.
Он такой: "А, у тебя число 5, а у тебя строка '5'? Да похуй, я строку в число превращу, и всё, братья теперь!" И выдаёт true. Хотя по факту-то это разные типы данных, ёпта!
=== (строгое равенство, оно же "родной брат")
А вот этот — максималист, как тот Герасим из рассказа. Он смотрит и на значение, И НА ТИП. Если типы разные — сразу пизда, false, без разговоров. Никаких "давайте я вам тут преобразую". Чистота, блядь, принципы.
Он такой: "Ты кто? Число? А ты кто? Строка? Нахуй пошли, вы не равны". И всё.
Вот тебе наглядная разница, смотри:
console.log(5 == '5'); // true (строка '5' волшебным хуем превращается в число 5)
console.log(5 === '5'); // false (разные типы: number vs string, нихуя не равны)
console.log(null == undefined); // true (специальное правило языка, типа "оба ничто")
console.log(null === undefined); // false (а вот тут уже разные типы, оба ничто, но разные!)
console.log(0 == false); // true (лживый false превращается в нолик 0)
console.log(0 === false); // false (number vs boolean, опять мимо)
А теперь главное, золотое правило, которое спасёт тебе ебало от тонн багов:
Почти ВСЕГДА, блядь, ВСЕГДА используй ===. Забудь про == как про страшный сон. Строгое сравнение — это предсказуемо, надёжно и соответствует принципам написания чистого кода, где тебя не ебёт неявная магия приведения типов.
Иначе будешь потом как дурак сидеть и думать: "Почему у меня 0 == false возвращает true, и вся логика накрылась медным тазом?". А потому что использовал того "похожего братана", который тебя и подставил, хитрая жопа.
Запомни: === — твой друг. == — это пиздопроебина, которая только выглядит безобидно.