有人能解释一下这个javascript行为吗? isNaN([])

时间:2017-11-08 20:39:51

标签: javascript

我只是不明白:

isNaN([]) === false -> true

在浏览器中或在node.js中

我想了解原因。

2 个答案:

答案 0 :(得分:1)

这与类型强制有关。当isNaN收到除数字之外的任何内容时,它会将值强制转换为数字......所以它基本上是+value。由于+[]00为数字,isNaN会返回false

如果您想检查某个值是否不是数字,则需要将其转换为parseInt(或parseFloat)。这两个函数都将为空数组返回NaN。

不同之处在于转换时您明确告诉它输入是类似数字的,因此应该可以转换为Number类型的值而不会出现问题。由于[]不是数字,因此尝试解析(转换)将导致NaN。

这是解析和转换如何工作的极其简化的解释。首先,它们是两个不同的东西。如果您想了解有关这两者如何运作的更多信息,请启动here

然而,通过强制(你正在做的事情),你基本上传递了一个值并且“假设”(因为没有更好的词),值类型与参数的要求兼容。所以isNaN接收一个数组并且猜测你想要传递一个数字,并在执行实际操作之前将其强制转换为等价数字(在空数组的情况下为0)。所以isNaN在0上执行,而不是空数组。

同样,这种解释过于简单了。有关JS中类型强制的更多信息,请转到here

答案 1 :(得分:0)

NAN是数学函数失败时返回的内容。 NaN几乎存在于所有进行浮点数学运算的语言中。但是,当值被强制为没有数字表示的数字时,一些Javascript函数(以及强制值的内部逻辑)也会返回NaN。如果您认为NaN是针对您的数学给出无意义答案而忽略其在表示数字coersion失败中的作用的情况,那么为什么isNaN被定义的方式要容易得多。显然,在编写Javascript时,你需要考虑(并使用)coerion NaN,但如果你暂时忽略这一点,那么这种特殊的语言设计选择会更有意义。

因此,例如math.sqrt(-1)是NAN。当且仅当其输入参数为NAN时,isNAN函数才返回true。由于[]不是NAN,我希望isNAN([])返回false。 isNAN是用于确定某些内容是否为数字的错误函数。它确实有奇怪的版本规则,没有它们的buteven,isNAN([]的答案是相同的。 []不是NAN对象,因此isNAN([])为false。正如@NicolásStraub所指出的那样,实现恰好将[]强制转换为数字,但我们期望在给定isNAN的接口契约时得到相同的结果,即使它没有。

ReferenceError: ISNAN is not defined
at repl:1:1
at REPLServer.defaultEval (repl.js:272:27)
at bound (domain.js:287:14)
at REPLServer.runBound [as eval] (domain.js:300:12)
at REPLServer.<anonymous> (repl.js:441:12)
at emitOne (events.js:82:20)
at REPLServer.emit (events.js:169:7)
at REPLServer.Interface._onLine (readline.js:203:10)
at REPLServer.Interface._line (readline.js:542:8)
at REPLServer.Interface._ttyWrite (readline.js:819:14)
  

isNaN   [功能:isNaN]

     

isNaN( “条”)       真

但是,"bar"实际上不是IEEE而不是数字浮点结构,所以我们期望函数会告诉我们"bar"不是NaN。因为isNaN强迫它的参数是一个数字,它给了我们错误的答案。 es6 Number.isNaN函数会给我们正确答案"bar"不是NaN