2015-12-15 5 views
8

Я прошел через подобные вопросы и ответы на StackOverflow и нашел это:Почему номер («») возвращает 0, тогда как ParseInt («») возвращает NaN

parseInt("123hui") 
returns 123 

Number("123hui") 
returns NaN 

As, parseInt() разбирает до первого не -digit и возвращает все, что было проанализировано, и Number() пытается преобразовать всю строку в число, почему маловероятное поведение в случае parseInt('') и Number('').

Я чувствую себя идеально parseInt должен вернуться NaN так же, как это делает с Number("123hui")

Теперь мой следующий вопрос:

Как 0 == '' возвращает true Я считаю, что он интерпретирует как 0 == Number('') это верно. Так компилятор действительно относится к нему как 0 == Number(''), а не как 0 == parseInt(''), или я пропустил некоторые моменты?

+6

Ну, именно так оно и предназначалось для работы. Или, может быть, развился так, чтобы работать. В любом случае, слишком поздно, чтобы изменить его. И есть хорошие варианты использования для обоих методов. Вам просто нужно выбрать тот, который подходит. – Thilo

+0

Также обратите внимание, что 'Number' также поддерживает числа с плавающей запятой, а не только целые числа. – Thilo

+0

В идеале или нет, это не так, как это работает. Вы можете пользоваться https://www.youtube.com/watch?v=FqhZZNUyVFM, хотя – pvg

ответ

4

Разница частично обусловлена ​​Number() с использованием дополнительной логики для принуждения типа. В the rules it follows для этого есть:

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

В то время как parseInt() определяются просто найти и оценить числовые символы на входе, на основании данных или обнаружено radix. И было определено, что ожидается хотя бы один действительный символ.

13) Если S содержит код блок, который не является radix- R цифры, пусть Z подстроки S, состоящим из всех кодовых блоков перед первым блоком такого кода; в противном случае пусть Z be S.

14) Если Z пусто, возврат NaN.

Примечание: «S» является строкой ввода после любой ведущей пробельной удаляются.


Как 0=='' возвращает true Я считаю, что он интерпретирует как 0==Number('') [...]

Правила, == использования определяются как Abstract Equality.

И вы правы в том, что используется принуждение/преобразование.Соответствующий шаг # 6:

Если Тип (х) является количество и тип (у) является String,
возвращают результат сравнения х == ToNumber (у).

+0

Для вашего обычного сравнения равенства (когда вы не пытаетесь преобразовать типы в одно и то же время) обычно лучше делать '===' вместо '==' и избегать путаницы принуждения типа. – Thilo

+0

@Thilo: Ну, когда вы не конвертируете типы, потому что оба они одинаковы (как и должно быть), нет путаницы, и вы можете просто использовать '=='. – Bergi

-1

parseInt("") является NaN, потому что стандарт говорит, так что даже если +"" является 0 вместо (также просто потому, что стандарт говорит так, подразумевая, например, что "" == 0).

Не смотрите на логику в этом, потому что нет глубокой глубокой логики, просто история.

Вы, на мой взгляд, делаете БОЛЬШУЮ ошибку ... чем скорее вы ее исправите, тем лучше будет для вашей жизни программирования с помощью Javascript. Ошибка заключается в том, что вы предполагаете, что каждый выбор, сделанный в языках программирования, и каждая техническая информация о них логичны. Это просто неправда.

Специально для Javascript.

Пожалуйста, помните, что Javascript был «спроектирован» в спешке и, только из-за судьбы, он стал чрезвычайно популярным за одну ночь. Это вынудило сообщество стандартизировать его перед серьезной мыслью о деталях, и поэтому оно было в основном «заморожено» в его нынешнем печальном состоянии перед серьезными испытаниями на местах.

Есть части, которые настолько плохо, что даже не смешно (например with заявления или оператор == равенства, которое так сломан, что серьезные JS Иды предупреждают о любой использовать его: вы получите такие вещи, как A==B, B==C и A!=C даже с использованием только нормальных значений и без «специального» значения как null, undefined, NaN или пустые строки "", а не из-за точных проблем).

Чехлы особых случаев повсюду в Javascript, и попытка поставить их в логическую структуру - это, к сожалению, потраченное впустую усилие. Просто изучите его странности, много читайте и наслаждайтесь фантастической средой выполнения, которую он предоставляет (это где Javascript действительно сияет ... браузеры и их JIT - поистине впечатляющая часть технологии: вы можете написать несколько строк и получить действительно полезное программное обеспечение на гаджион различных вычислительных устройств).

Официальный стандарт, в котором перечислены все странности, довольно трудно читать, поскольку он очень точен, и, к сожалению, правила, которые он должен указать, действительно сложны.

Кроме того, как получает языка больше возможностей правил станут еще более сложным, например, что для ES5 просто еще один странного «особого» случая (например, ToPrimitive поведения операции Date объектов) становится «нормальный» случай ES6 (где ToPrimitive можно настроить).

Не уверен, что эта «нормализация» - это что-то, что нужно радоваться ... реальная проблема - это замороженная отправная точка, и теперь нет простых решений (если вы не хотите выбросить весь существующий код javascript, то есть).

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

Javascript такой. Кроме того, что он не начинал красиво и чисто, и, кроме того, не было времени отполировать его, прежде чем бросать его в игру.

+1

Пример с '==' ужасен: '==' не транзитивен на многих языках (даже в скомпилированном). – zerkms

+3

Это очень упрямый и субъективный ответ, это действительно просто длинный комментарий. Я думаю, что вы пропустили весь смысл javascript как простой, простой в использовании язык сценариев, в котором функции, подобные '==', имеют смысл (например, так «1» == 1'). – RobG

+1

@RobG: '==' правила не делают Javascript простым в использовании, на самом деле все наоборот. Вы в конечном итоге с программами, которые когда-то работают, а когда-то не по-видимому нет причин. Кстати, '1' также равно' [1] 'и' '1" '(пробел в конце).Но '[1]' не равно '' 1 "'. Правила не простые, но довольно запутанные и странные (проверьте официальный стандарт экстернара для какой-то забавы) ... они просто являются формализацией первоначального взлома. Впечатляюще, чтобы быть взломом, но все же просто не вполне обоснованным взломом. – 6502

0

Чтобы ответить на ваш вопрос о 0=='' возвращает истину:

Ниже приводится сравнение числа и строки:

Равно Оператора (==)

Type (x) Type(y)    Result 
------------------------------------------- 
x and y are the same type  Strict Equality (===) Algorithm 
Number String     x == toNumber(y) 

и toNumber выполняет следующие строковые аргументы:

toNumber: 

Argument type Result 
------------------------ 
String   In effect evaluates Number(string) 
       “abc” -> NaN 
       “123” -> 123 

Number('') возвращает 0. Так что оставляет вас с 0==0 который оценивается с помощью строгого равенства (===) Алгоритм

Строгое Равно Оператор (===)

Type   values      Result 
---------------------------------------------------------- 
Number  x same value as y    true 
      (but not NaN) 

Вы можете найти полный список @javascriptweblog.wordpress.com - truth-equality-and-javascript.

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