2

Я читал о типах undefined и null и пришел к таким выводам: undefined то же что и null, отличие лишь в том, что

var answer;
console.log(answer); // undefined
var answer = null;
console.log(answer); // null

undefined говорит что переменная была создана, но в нее ничего не записали.

null говорит что переменная была создана, но ее значение пока неизвестно.

Вопрос в следующем:

console.log(null==undefined) //true
console.log(null===undefined) //false

получается что оператор == сравнивает по значению, а === сравнивает по типу?

  • 1
    Это одна из известных ошибок дизайна языка к сожалению. Во первых то что null == undefined - жестко зашито в спеке. Семантика null когда-то в незапамятные времена задумывалась когда-то как несуществующий объект. Поэтому typeof(null) === 'object', а undefined - несуществующий примитив, typeof(undefined) === 'undefined'. У них есть и еще отличия, например +null (унарный плюс приводит к числу) - это ноль. +undefined - NaN. В общем это довольно разные штуки к сожалению, и их обе порой приходится иметь в виду – Утка Учится Укрываться Jan 11 '18 at 09:25
  • 1
    Ответ на вторую часть вопроса вы можете посмотреть например тут: https://ru.stackoverflow.com/questions/431662/%D0%92-%D1%87%D0%B5%D0%BC-%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-%D0%B8 – Утка Учится Укрываться Jan 11 '18 at 09:28

1 Answers1

3

Oracle Client-Side JavaScript Reference

Equal (==) Returns true if the operands are equal. If the two operands are not of the same type, JavaScript attempts to convert the operands to an appropriate type for the comparison.

Strict equal (===) Returns true if the operands are equal and of the same type.

Akina
  • 31,807
  • ok, but which will common type of operands if compare (undefined==null) ? – Andrey Fedorovich Jan 11 '18 at 09:27
  • То, что цитата из документации на буржуйском, не означает, что SO.ru превратился в SO.en... – Akina Jan 11 '18 at 09:29
  • @AndreyFedorovich здесь все на русском, просто отвечающему было лень переводить спеку. Как я упомянул в своем комментарии undefined и null - это нефига не одно и то же, ваш эмпирический вывод просто неверен. – Утка Учится Укрываться Jan 11 '18 at 09:29
  • 1
    И я не вижу никакой необходимости выяснять, к какому типу надо приводить "ни хрена" и "хрен знает". – Akina Jan 11 '18 at 09:31
  • Ладно, на самом деле @УткаУчитсяУкрываться ответил довольно понятно на мой вопрос, я с вами согласен, нет смысла выяснять какой будет общий тип)) – Andrey Fedorovich Jan 11 '18 at 09:33
  • @Akina, вот необходимость была бы, но в спеке в описании того как сравнивать теплое с мягким специально отдельно описан этот момент. Тут вопрос не столько в том как сравнивать "ни хрена" и "хрен знает" как "почему у нас две разные сущности почти на ровном месте" для "ни хрена" и "хрен знает" – Утка Учится Укрываться Jan 11 '18 at 09:34
  • @УткаУчитсяУкрываться необходимость была бы В таком случае пришлось бы приводить к типу undefined - он явно более общий :) только я даже представить не могу, как что-то привести к такому типу, не потеряв по дороге значения... – Akina Jan 11 '18 at 09:42
  • @Akina, в данный момент что попало пытаются в первую очередь привести к числу, поэтому интуитивное понимание обычного сравнения у большинства разработчиков не знающих эти особенности такое: наверное null привели к нулю и undefined привели к нулю, поэтому они и равны. Что приводит к туче ошибок конечно когда выясняется что у null и undefined свои отличающиеся отношения с нулем. Необходимость "приводить к типу undefined" больше нигде не встречается, возможно чтобы не городить одну веточку алгоритма для конкретного случая этот пункт конкретно и был сделан... – Утка Учится Укрываться Jan 11 '18 at 09:52