为什么 isNaN(" ") (带空格的字符串)等于 false?

IT技术 javascript nan
2021-02-04 13:49:01

在 JavaScript 中,为什么isNaN(" ")计算为false,但isNaN(" x")计算为true

我在一个文本输入字段进行数字运算,和我正在检查该字段为null""NaN当有人在字段中输入少量空格时,我的验证对所有三个都失败了,我很困惑为什么它通过了isNaN检查。

6个回答

JavaScript 将空字符串解释为 0,然后通过 isNAN 测试失败。您可以先在字符串上使用 parseInt,它不会将空字符串转换为 0。结果应该会失败 isNAN。

@Jean-François 你说得对,更正确的说法是“isNaN 将空字符串解释为 0”,而不是 JavaScript 本身。
2021-03-13 13:49:01
但是 parseInt("123abcd") 返回 123,这意味着 isNaN(parseInt("123abcd")) 将返回 false 而它应该返回 true!
2021-03-18 13:49:01
口译有 2 个步骤isNaN(arg)1) 将 arg 转换为数字,2) 检查该数字是否为数值NaN这有助于我更好地理解它。
2021-03-18 13:49:01
那么 (IsNaN(string) || isNaN(parseInt(string)))
2021-04-05 13:49:01
@Antonio_Haley 等一下,我不明白。如果“JavaScript 将空字符串解释为 0”,为什么 parseInt("") 返回 NaN?
2021-04-05 13:49:01

您可能会觉得这令人惊讶,也可能不会,但这里有一些测试代码向您展示 JavaScript 引擎的古怪之处。

document.write(isNaN("")) // false
document.write(isNaN(" "))  // false
document.write(isNaN(0))  // false
document.write(isNaN(null)) // false
document.write(isNaN(false))  // false
document.write("" == false)  // true
document.write("" == 0)  // true
document.write(" " == 0)  // true
document.write(" " == false)  // true
document.write(0 == false) // true
document.write(" " == "") // false

所以这意味着

" " == 0 == false

"" == 0 == false

"" != " "

玩得开心 :)

@Kooilnc 甚至不会从 javascript 的古怪中稍微拿走一点,但这些 NaN 只是遵守 IEEE 754 浮点标准。您可以像往常一样在大 W 上阅读有关它的所有内容:en.wikipedia.org/wiki/NaN
2021-03-15 13:49:01
你应该尝试 NaN===NaN 或 NaN==NaN;-) 我不知道这是否意味着 javascript 引擎很古怪,或者 javascript 对古怪的程序员不利。
2021-03-17 13:49:01
很棒的帖子,但没有解释“为什么”。
2021-03-30 13:49:01
+1 很棒的帖子。您能在这里添加三等号(=== 和 !==)运算符的适用性吗?
2021-04-03 13:49:01
@Kooilnc NaN != NaN 实际上是一次不错的选择。这个想法是 NaN 几乎总是一个计算结果与程序员预期的不同,并且假设两个“错误”计算的结果相等是非常危险的,我会说。
2021-04-11 13:49:01

为了更好地理解它,请打开第 43 页“ToNumber 应用于字符串类型”上的Ecma-Script 规范 pdf

如果字符串具有数字语法,可以包含任意数量的空白字符,则可以将其转换为数字类型。空字符串的计算结果为 0。字符串 'Infinity' 也应该给出

isNaN('Infinity'); // false

尝试使用:

alert(isNaN(parseInt("   ")));

或者

alert(isNaN(parseFloat("    ")));
嗨先生, isNaN(parseInt("123a")) :将返回 123 所以你的解决方案将不起作用,如果字符串包含 aplha 数字
2021-04-10 13:49:01

MDN您面临的问题的原因

当 isNaN 函数的参数不是 Number 类型时,该值首先被强制转换为 Number。然后测试结果值以确定它是否为 NaN。

您可能需要查看以下综合答案,其中也涵盖了 NaN 比较的相等性。

如何测试 JavaScript 变量是否为 NaN