JavaScript 中的number(数字)类型包含整数和浮点数:
const integer = 4; const float = 1.5; typeof integer; // => 'number' typeof float; // => 'number'
另外,还有 2 个特殊的数字值:Infinity
(大于任何其他数字的数字)和 NaN
(表示“非数字值--Not A Number”概念):
const infinite = Infinity; const faulty = NaN; typeof infinite; // => 'number' typeof faulty; // => 'number'
虽然直接使用 NaN
的情况很少见,但在对数字进行无效的操作后,它可能会令人惊讶地出现。
让我们仔细看一下 NaN
特殊值:如何检查变量是否具有 NaN
,并重要地了解创建“非数字”值的方案。
NaN number
JavaScript 中的number类型是所有数字值的集合,包括 “非数字值”,正无穷和负无穷。
可以使用特殊表达式 NaN
、全局对象或 Number
函数的属性来访问“非数字值”:
typeof NaN; // => 'number' typeof window.NaN; // => 'number' typeof Number.NaN; // => 'number'
尽管具有number类型,但“非数字值”是不代表实数的值。NaN
对于表示错误的数字运算,是很有用的。
例如,将数字与 undefined
相乘不是有效操作,因此结果为 NaN
:
1 * undefined; // => NaN
同样,尝试解析无效的数字字符串(如 'Joker'
)也会导致 NaN
:
parseInt('Joker', 10); // => NaN
检查和 NaN 是否相等
NaN
有趣的特性是它不等于任何值,即使NaN
本身也是如此:
NaN === NaN; // => false
此行为有助于检测变量是否为NaN
:
const someNumber = NaN; if (someNumber !== someNumber) { console.log('Is NaN'); } else { console.log('Is Not NaN'); } // logs "Is NaN"
仅当 someNumber
是 NaN
时,someNumber !== someNumber
表达式才是 true
。因此,以上代码片段输出到控制台的结果是 "Is NaN"
。
JavaScript 具有检测 NaN
的内置函数: isNaN()
和 Number.isNaN()
:
isNaN(NaN); // => true isNaN(1); // => false Number.isNaN(NaN); // => true Number.isNaN(1); // => false
这些函数之间的区别在于,Number.isNaN()
不会将其参数转换为数字:
isNaN('Joker12'); // => true Number.isNaN('Joker12'); // => false
isNaN('Joker12')
将参数 'Joker12'
转换为数字,即 NaN
。因此该函数返回 true
。
另一方面,Number.isNaN('Joker12')
会检查参数是否为 NaN
而不进行转换。该函数返回 false
,因为'Joker12'
不等于 NaN
。
导致 NaN 的运算
1、解析数字
在 JavaScript 中,你可以将数字字符串转换为数字。
例如,你可以轻松地将字符串 '1.5'
转换为浮点数 1.5
:
const numberString = '1.5'; const number = parseFloat(numberString); number; // => 1.5
当字符串不能被转换为数字时,解析函数会返回 NaN
:表示解析失败。这里有些例子:
parseFloat('Joker12.5'); // => NaN parseInt('Joker12', 10); // => NaN Number('Joker12'); // => NaN
解析数字时,最好先验证一下解析结果是否为 NaN
:
let inputToParse = 'Invalid10'; let number; number = parseInt(inputToParse, 10); if (isNaN(number)) { number = 0; } number; // => 0
解析 inputToParse
失败,因此 parseInt(inputToParse, 10)
返回 NaN
。条件 if (isNaN(number))
为 true
,并且将 number
赋值为 0
。
2、将 undefined
作为操作数
把 undefined
用作加法、乘法等算术运算中的操作数会生成 NaN
。
例如:
function getFontSize(style) { return style.fontSize; } const fontSize = getFontSize({ size: 16 }) * 2; const doubledFontSize = fontSize * 2; doubledFontSize; // => NaN
getFontSize()
是从样式对象访问 fontSize
属性的函数。调用 getFontSize({ size: 16 })
时,结果是undefined
(在 { size: 16 }
对象中不存在 fontSize
属性)。
fontSize * 2
被评估为 undefined * 2
,结果为 NaN
。
当把缺少的属性或返回 undefined
的函数用作算术运算中的值时,将生成 “非数字值”。
防止 NaN
的好方法是确保 undefined
不会进行算术运算,需要随时检查。
3、将 NaN
作为操作数
当算数运算的操作数为 NaN
时,也会生成 NaN
值:
1 + NaN; // => NaN 2 * NaN; // => NaN
NaN
分布在算术运算中:
let invalidNumber = 1 * undefined; let result = 1; result += invalidNumber; // append result *= 2; // duplicate result++; // increment result; // => NaN
在将 invalidNumber
值(具有 'NaN'
)附加到 result
之后,会破坏对 result
变量的操作。
4、不确定(Indeterminate) 形式
当算术运算采用不确定形式时,将会产生 NaN
值。
例 0/0
和 Infinity/Infinity
这样的的除法运算:
0 / 0; // => NaN Infinity / Infinity; // => NaN
0
和 Infinity
的乘法运算:
0 * Infinity; // => NaN
带有不同符号的 Infinity
的加法:
-Infinity + Infinity; // => NaN
5、无效的数学函数参数
负数的平方根:
Math.pow(-2, 0.5); // => NaN (-2) ** 0.5; // => NaN
或负数的对数:
Math.log2(-2); // => NaN
总结
JavaScript 中用 NaN
表示的的“非数字值”概念对于表示错误的数字运算很有用。
NaN
不等于任何值,即使是NaN
本身也不等于。建议使用 Number.isNaN(value)
方法来检查变量是否包含 NaN 。
将字符串形式的数字转换为数字类型失败时,可能会导致显示“非数字值 NaN
”。最好检查一下 parseInt()
、parseFloat()
或 Number()
是否返回了 NaN
。
算术运算中 undefined
或 NaN
作为操作数时,通常会导致 NaN
。正确处理 undefined
(为缺少的属性提供默认值)是防止这种情况的好方法。
数学函数的不确定形式或无效参数也会导致 “非数字值 NaN
”。但是这些情况很少发生。
这是我的务实建议:出现了 NaN
?赶快检查是否存在 undefined
!
英文原文地址:https://dmitripavlutin.com/nan-in-javascript/
为了保证的可读性,本文采用意译而非直译。
更多前端开发知识,请查阅 HTML中文网 !!
以上就是JavaScript中的NaN(非数字)的详细内容,更多请关注0133技术站其它相关文章!