2013-05-31 2 views
3

В JavaScript в Chrome и Firefox:Почему " п" число "NaN" в Javascript

isNaN("\n") дает false
parseFloat ("\n") дает NaN

То же дали для \t, \r и \f. '

  • \n ряд
  • Parsed \n дает не число.
  • Экранированные символы, такие как NULL-байт \0, \\ и \" действительно работают должным образом.
  • Мы знаем, что NaN это число, просто не представима любым другим значением
  • Так \n это число, которое не представима.

Почему браузеры реализуют его таким образом?

+0

'parseFloat' может возвращать' NaN', но '+" \ n "' возвращает '0'. Существует различие между * parsing * строкой с 'parse (Float | Int)' и просто преобразованием ее в число. * «Почему браузеры реализуют это так?» * Потому что спецификация диктует это. –

+0

Я понял, что есть разница. Я подозревал, что разбор требует действительных чисел («NaN не может отображать это как число»), но я не мог найти googling NaN и разбор. @FelixKling вы могли бы связать мне эту спецификацию? Я люблю понимать, почему именно. –

+0

'parseFloat': http://es5.github.io/#x15.1.2.3,' isNaN': http://es5.github.io/#x15.1.2.4 и 'toNumber': http://es5.github.io/#x9.3. –

ответ

7

Поскольку преобразование любой строки, состоящей только из пробела (или пустой), приводит к 0.

console.log(Number("\n")); // 0 

В parseInt/Float методы фактически требуют некоторые цифровой контент, чтобы быть преобразованы, хотя это позволит начальные пробелы и замыкающего мусор.

console.log(parseFloat(" 123.45odsifjj")); // 123.45 

ToNumber преобразования определяется в 9.3.1 ToNumber Applied to the String Type.

СтроковойЧисленныйЛитерал пуст или содержит только пустое пространство преобразуется в +0

+1

В документации есть хороший пример: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FisNaN связанных строк что приведет к ложным результатам. –

+1

Спасибо. Это кажется правильным. Я добавил цитату из спецификации. –

+0

Добро пожаловать. И спасибо за редактирование. Принял его, как только увидел. :-) –

0

Это связано с динамической типизации при вызове isNaN. "\n" не является NaN (значение, указанное для floats и doubles), "\n" - это строка.

EDIT: Очевидно, что при вызове isNaN("\n"), "\n" преобразуется в число первых, используя ToNumber, который не имеет точно такое же поведение, как parseFloat.

Однако W3C w3schools говорит по parseFloat:

Если первый символ не может быть конвертирован в число, parseFloat() возвращает NaN.

Это то, что вызывает асимметрию.

+0

'isNaN' сначала преобразует вход в число. См. Http://es5.github.io/#x15.1.2.4. Поэтому причина 'isNan (" \ n ")' не в том, что входной файл является строкой. И w3schools никак не связаны с W3C. Пожалуйста, не делайте ошибки и не смешивайте их. –

+1

W3Cschools - это не любая спецификация, которую я приму. Когда-либо. –

+1

@ Derk-Jan: Вы должны, они определили HTML, CSS, XML и множество других стандартов. Если вы имеете в виду w3schools, я согласен с вами;) –

Смежные вопросы