Как isNaN (blabla); -> true, ложно-положительный? - PullRequest
0 голосов
/ 25 мая 2018

С MDN

// Это ложный положительный результат, и причина, по которой isNaN не совсем надежна

isNaN ('blabla');// true: «блабла» конвертируется в число.

Как выше false positive?Не является ли blabla действительно не числом, и поэтому вместо него должно быть true positive.В котором вышеприведенное не является хорошим примером того, почему isNaN is not entirely reliable.

Я искал, что blabla является числом в некоторой системе счисления, не встречал ни одного.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Не является ли blabla действительно не числом

NaN является числом (несмотря на то, что его название является аббревиатурой от "не числа").isNaN() проверяет, является ли число, которое вы передаете, NaN.

"blabla" не NaN.Этого не может быть, потому что "blabla" вовсе не число.Вот почему isNaN("blabla") возвращение true считается ложноположительным.

Если мы будем использовать его имя, isNaN должно возвращать true только если аргумент

  1. - это число, а
  2. имеет специальное значение NaN.

Вместо этого оно сначала неявно приводит любое нечисловое значение к числу, а затем проверяет результат.Вот как мы в итоге получаем, что isNaN({}) будет true, а isNaN([]) будет false.

Конечно, если вы думаете о isNaN(x) как " будет x, когдаконвертируется в число, в результате получается NaN?", тогда это не ложное срабатывание.Но это не то, чего ожидает большинство людей.

0 голосов
/ 25 мая 2018

Поскольку NaN, заданное IEEE 754, является результатом определенной операции с плавающей запятой.Вот список

 inf  -  inf = NaN
-inf  +  inf = NaN
   0  /  0   = NaN
  -0  /  0   = NaN
   0  / -0   = NaN
  -0  / -0   = NaN
 inf  /  inf = NaN
-inf  /  inf = NaN
 inf  / -inf = NaN
-inf  / -inf = NaN
 inf  *  0   = NaN
 inf  * -0   = NaN

, поэтому проверка значения, равного NaN на isNaN (согласно IEEE 754), аналогична запросу, является ли значение результатом какого-либо из вышеперечисленныхупомянутые операции.

blabla не является результатом какой-либо из вышеупомянутых операций и как таковой не должен рассматриваться как NaN, но это так.(Поэтому считается ложным положительным)

0 голосов
/ 25 мая 2018

Как вышеупомянутое ложное срабатывание?Разве это не блабла, на самом деле это не число, и поэтому оно должно быть истинно положительным.

Поскольку аргумент, передаваемый isNaN(), неявно преобразуется в number тип (независимо от того, может ли оно быть действительным числом).Я подозреваю, что это потому, что некоторые строки могут иметь числовой эквивалент .

Однако метод Number.isNaN() является более конкретным тестом и возвращает правильный результат, поскольку преобразование не выполняется - переданное значение не должно быть NaN и его тип без принуждения должен быть Number, чтобы он мог вернуть false.

Вы можете рассматривать эти две версии как аналогичные == и ===.

console.log(isNaN("BlahBlah"));         // true!
console.log(Number.isNaN("BlahBlah"));  // false ;)
...