Если у меня есть этот JavaScript

var someVar = someOtherVar == null;

Какие значения someOtherVar приведут к истинности someVar?

Примечание. Из того, что я прочитал, если someOtherVar равен undefined, то someVar будет верным. Но я много изменяю свой код, чтобы использовать этот стиль сравнения, и я хочу быть уверен, что больше ничего не приведет к выражению правдивости (кроме null и {{X4} } ) .

1
Vaccano 24 Апр 2017 в 23:26

2 ответа

Лучший ответ

Какие значения someOtherVar приведут к someVar быть true?

Только null и undefined.

Алгоритм в спецификации относительно прост :

  1. Если Type(x) совпадает с Type(y), тогда верните результат выполнения Сравнение строгого равенства x === y.
  2. Если x равен нулю , а y неопределен , верните true .
  3. Если x равен undefined , а y равен нулю , верните true .
  4. Если Type(x) равен Number, а Type(y) - String, вернуть результат сравнения x == ToNumber(y).
  5. Если Type(x) - это строка, а Type(y) - это число, вернуть результат сравнения ToNumber(x) == y.
  6. Если Type(x) - логическое значение, вернуть результат сравнения ToNumber(x) == y.
  7. Если Type(y) - логическое значение, вернуть результат сравнения x == ToNumber(y).
  8. Если Type(x) является либо строкой, числом или символом, а Type(y) является объектом, вернуть результат сравнения x == ToPrimitive(y).
  9. Если Type(x) является объектом, а Type(y) является либо строкой, числом или символом, вернуть результат сравнения ToPrimitive(x) == y.
  10. Вернуть false .

Шаг 1 обрабатывает случай null == null. Шаг 2 и 3 обрабатывают случаи null == undefined и undefined == null. Шаги 6 и 7 обрабатывают случаи, когда другое значение является логическим, поэтому в итоге вы сравниваете число с null. Поскольку null не является объектом, числом, строкой, логическим значением или символом, не применяются другие этапы, поэтому возвращается false (шаг 10).


Какие принуждения от нулевого сравнения в JavaScript?

Только если другое значение является логическим , оно будет приведено к числу , поэтому вы в конечном итоге сравниваете 0 == null или 1 == null, оба которые false.

Во всем остальном случае приведения типов не происходит (ничто не приведено к null, а null не приведено к какому-либо другому типу данных).

4
Felix Kling 24 Апр 2017 в 20:40

Выглядит только null и undefined:

const arr = ['string', true, false, 0, null, undefined, NaN, {}, [], 4, -1, -0];

const r = arr.map((e,i) => {
    return { i, e, bool: e == null }
}).filter(e => e.bool);

// return elements which result in 'null'
// i: index inside initial array 'arr'

console.log(JSON.stringify(r, null, 2));
1
Egor Stambakio 24 Апр 2017 в 20:46