Как оценивается сравнение, если оно включает NaN в Javascript? - PullRequest
0 голосов
/ 08 ноября 2018

Я понимаю причину этого. Мне любопытно о технической реализации. Не могу найти это где-нибудь.

Моя теория состоит в том, что как только левый NaN оценивается в любом сравнении, он автоматически возвращает false, не выполняя сравнение вообще. Это правильно?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Просто чтобы уточнить точку на КАК. Я был удивлен, учитывая (правильный) ответ @ CertainPerformance, что приведенный ниже код привел к значению "a", являющемуся "перезаписанным".

let a = 'overwrite me';

let x = () => {
  a = 'overwritten'; 
  return 7;
}

NaN === x();

alert(a);

Но, внимательно прочитав отрывок, я понял, что typeof (x ()) вызывается за кулисами, что может привести к перезаписи.

Другими словами, это не короткое замыкание в полном смысле этого слова.

0 голосов
/ 08 ноября 2018

Да - если оба типа одинаковы и являются числами, то если левый равен NaN, то результат равен false, без проверки значения правого:

https://www.ecma -international.org / ECMA-262 / 6,0 / # втор-строгого равенства, сравнение

7.2.13 Сравнение строгого равенства

Сравнение x === y, где x и y являются значениями, дает истину или ложь. Такое сравнение выполняется следующим образом:

Если тип (x) отличается от типа (y), вернуть false.

Если тип (x) не определен, вернуть true.

Если тип (x) равен нулю, вернуть true.

Если тип (x) является числом, то

  • Если x равен NaN, вернуть false.

  • Если y равен NaN, вернуть false.

  • Если x - это то же значение числа, что и y, вернуть true.

  • Если x равен +0, а y равен −0, вернуть true.

  • Если x равен −0, а y равен +0, вернуть true.

  • Возврат false.

...

...