为什么Number('')返回0而parseInt('')返回NaN

时间:2015-12-15 06:22:57

标签: javascript

我在StackOverflow上遇到了类似的问题和答案,发现了这个:

parseInt("123hui")
returns 123

Number("123hui")
returns NaN

as,parseInt()解析到第一个非数字并返回它已解析的内容,Number()尝试将整个字符串转换为数字,为什么{{1}的情况不太可能发生}和parseInt('')

理想情况下Number('')应该parseInt返回NaN,就像Number("123hui")

一样

现在我的下一个问题是:

0 == ''返回true时,我认为它解释为0 == Number('')这是真的。那么编译器真的会像0 == Number('')那样对待它而不是0 == parseInt('')或者我错过了一些点吗?

3 个答案:

答案 0 :(得分:4)

差异部分是由于Number()使用了额外的类型强制逻辑。 the rules it follows中包括:

  
      
  • StringNumericLiteral 为空或仅包含空格会转换为 +0
  •   

parseInt()被定义为根据给定或检测到的radix简单地查找和评估输入中的数字字符。并且,它被定义为期望至少一个有效字符。

  

13)如果 S 包含的代码单元不是radix- R 数字,那么让 Z 成为的子字符串S 由第一个这样的代码单元之前的所有代码单元组成;否则,让 Z S

     

14)如果 Z 为空,则返回 NaN

注意:' S '是删除任何前导空格后的输入字符串。

  

0==''返回true时,我认为它解释为0==Number('') [...]

==使用的规则定义为Abstract Equality

而且,你对使用的强制/转换是正确的。相关步骤是#6:

  

如果Type( x )是Number且Type( y )是String,
  返回比较结果 x == ToNumber( y )。

答案 1 :(得分:0)

回答有关0==''返回true的问题:

以下是数字和字符串的比较:

等于运算符(==)

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

答案 2 :(得分:-1)

parseInt("")NaN,因为即使+""0,标准也会这样说(也只是因为标准是这样说的,这意味着{{1} })。

不要在这里寻找逻辑,因为没有深刻的逻辑,只有历史

你认为我犯了一个大错...你越早纠正它就越好用Javascript来编程。错误在于您假设编程语言中的每个选择以及关于它们的每个技术细节都是合乎逻辑的。事实并非如此。

特别是对于Javascript。

请记住Javascript是"设计"匆忙中,只是因为命运,它一夜之间变得非常受欢迎。这迫使社区在对细节进行任何认真考虑之前对其进行标准化,因此它基本上是“冻结”的。在对该领域进行任何严肃测试之前,目前处于悲伤状态。

有些部分非常糟糕,它们甚至都不好笑(例如"" == 0语句或with等式运算符如此破碎,严重的js IDE警告任何< / strong>使用它:即使只使用普通值,也可以使用<{1}},==A==B,而不使用任何&#34;特殊值&#34;值 喜欢B==CA!=Cnull或空字符串undefined,而不是因为精度问题。)

无意义的特殊情况在Javascript中无处不在,并且不幸的是,尝试将它们置于逻辑框架中是一种浪费的努力。通过阅读很多东西来学习它的奇怪之处并享受它提供的梦幻般的运行时环境(这是Javascript真正闪耀的地方......浏览器和它们的JIT是一项真正令人印象深刻的技术:你可以写几行并获得真正有用​​的软件运行在大量不同的计算设备上。)

列举所有奇怪内容的官方标准很难阅读,因为它的目的非常准确,不幸的是它必须指定的规则非常复杂。

此外,随着语言获得更多功能,规则将变得越来越复杂:例如,ES5只是另一种奇怪的特殊情况。 case(例如NaN对象的""操作行为)变为&#34; normal&#34; ES6中的案例(其中ToPrimitive可以自定义)。

不确定这是否正常化&#34;是一件令人高兴的事情......真正的问题是冷冻的起点,现在没有简单的解决方案(如果你不想丢弃所有现有的javascript代码,那就是)。

语言的正常路径开始干净,漂亮,对称且小巧。然后,当面对现实世界的问题时,语言会获得(被感染)一些丑陋的部分(因为世界是丑陋和不对称的)。

Javascript就是这样。除了它没有开始漂亮和干净,而且在投入游戏之前没有时间对其进行抛光。