NaN
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015å¹´7æ.
NaN å
¨åå±¬æ§æ¯ä¸åè¡¨ç¤ºéæ¸å¼çå¼ã
å試ä¸ä¸
function sanitize(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
console.log(sanitize("1"));
// é æè¼¸åºï¼"1"
console.log(sanitize("NotANumber"));
// é æè¼¸åºï¼NaN
å¼
è Number.NaN ç¸åçæ¸å¼ã
NaN ç屬æ§ç¹æ§ | |
|---|---|
| å¯å¯« | å¦ |
| å¯åè | å¦ |
| å¯é ç½® | å¦ |
æè¿°
NaN æ¯å
¨åç©ä»¶çä¸å屬æ§ãæå¥è©±èªªï¼å®æ¯å
¨åä½ç¨åä¸çä¸åè®æ¸ã
å¨ç¾ä»£ç覽å¨ä¸ï¼NaN æ¯ä¸åä¸å¯é
ç½®ãä¸å¯å¯«å
¥ç屬æ§ãå³ä½¿å¨éç¾ä»£ç覽å¨ä¸ï¼ä¹æé¿å
è¦å¯«å®ã
æäºç¨®ä¸åé¡åçéç®æåå³ NaNï¼
- æ¸å¼è½æå¤±æï¼ä¾å¦ï¼é¡¯å¼ç
parseInt("blabla")ãNumber(undefined)ï¼æé±å¼çMath.abs(undefined)ï¼ - çµæä¸æ¯å¯¦æ¸çæ¸å¸éç®ï¼ä¾å¦ï¼
Math.sqrt(-1)ï¼ - ä¸å®åï¼ä¾å¦ï¼
0 * Infinityã1 ** InfinityãInfinity / InfinityãInfinity - Infinityï¼ - éç®å
çº
NaNæè¢«å¼·å¶è½åçºNaNçæ¹æ³æè¡¨éå¼ï¼ä¾å¦ï¼7 ** NaNã7 * "blabla"ï¼ââéæå³èNaNå ·æå³ææ§ - å
¶ä»å°ç¡æå¼è¡¨ç¤ºçºæ¸å¼çæ
æ³ï¼ä¾å¦ï¼ç¡æç Date
new Date("blabla").getTime()ã"".charCodeAt(1)ï¼
NaN åå
¶è¡çºä¸¦é JavaScript æé¦åµãå®å¨æµ®é»æ¸éç®ä¸çèªç¾©ï¼å
æ¬ NaN !== NaNï¼æ¯ç± IEEE 754 æ¨æºæå®ç¾©ãNaN çè¡çºå
æ¬ï¼
- 妿
NaNæ¶åæ¸å¸éç®ï¼ä½ä¸å æ¬ä½å éç®ï¼ï¼çµæé叏乿¯NaNãï¼åè¦ä¸æ¹çåä¾ãï¼ - ç¶
NaNæ¯ä»»ä½éä¿æ¯è¼ï¼>ã<ã>=ã<=ï¼çéç®å ä¹ä¸æï¼çµæç¸½æ¯falseã NaNèä»»ä½å ¶ä»å¼æ¯è¼ï¼éé==ã!=ã===å!==ï¼çµæçä¸ç¸çââå æ¬èå¦ä¸åNaN弿¯è¼ã
NaN 乿¯ JavaScript ä¸ç falsy å¼ä¹ä¸ã
ç¯ä¾
>測試æ¯å¦çº NaN
è¦å¤æ·ä¸å弿¯å¦çº NaNï¼ä½¿ç¨ Number.isNaN() æ isNaN() æ¯ææ¸
æ¥çæ¹æ³ââæè
ï¼ç±æ¼ NaN æ¯å¯ä¸ä¸çæ¼èªèº«çå¼ï¼ä½ å¯ä»¥å·è¡èªææ¯è¼ï¼å¦ x !== xã
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
Number.isNaN(NaN); // true
function valueIsNaN(v) {
return v !== v;
}
valueIsNaN(1); // false
valueIsNaN(NaN); // true
valueIsNaN(Number.NaN); // true
ç¶èï¼è«æ³¨æ isNaN() å Number.isNaN() ä¹éçå·®ç°ï¼åè
妿å¼ç®åæ¯ NaNï¼æè
å¨å¼·å¶è½åçºæ¸å¼å¾æè®æ NaNï¼å°±æåå³ trueï¼èå¾è
åªæå¨å¼ç®åå°±æ¯ NaN æææåå³ trueï¼
isNaN("hello world"); // true
Number.isNaN("hello world"); // false
åºæ¼å樣çåå ï¼ä½¿ç¨ BigInt 弿ï¼isNaN() ææåºé¯èª¤ï¼è Number.isNaN() å䏿ï¼
isNaN(1n); // TypeError: Conversion from 'BigInt' to 'number' is not allowed.
Number.isNaN(1n); // false
æ¤å¤ï¼æäºé£åæ¹æ³ç¡æ³æ¾å° NaNï¼èå
¶ä»æ¹æ³åå¯ä»¥ãå
·é«ä¾èªªï¼å°æ¾ç´¢å¼çæ¹æ³ï¼indexOf()ãlastIndexOf()ï¼ç¡æ³æ¾å° NaNï¼èå°æ¾å¼çæ¹æ³ï¼includes()ï¼åå¯ä»¥ï¼
const arr = [2, 4, NaN, 12];
arr.indexOf(NaN); // -1
arr.includes(NaN); // true
// æ¥åé©ç¶å®ç¾©è¬è©çæ¹æ³ç¸½æ¯å¯ä»¥æ¾å° NaN
arr.findIndex((n) => Number.isNaN(n)); // 2
éæ¼ NaN åå
¶æ¯è¼çæ´å¤è³è¨ï¼è«åè¦ç¸çæ§æ¯è¼èç¸åæ§ã
å¯è§å¯å°çä¸å NaN å¼
ç¢çå
©åäºé²ä½è¡¨ç¤ºæ³ä¸åä½é½æ¯ NaN çæµ®é»æ¸æ¯å¯è½çï¼å çºå¨ IEEE 754 編碼ä¸ï¼ä»»ä½ææ¸çº 0x7ff ä¸å°¾æ¸éé¶çæµ®é»æ¸é½æ¯ NaNãå¨ JavaScript ä¸ï¼ä½ å¯ä»¥ä½¿ç¨åå¥é£åé²è¡ä½å
ç´çæä½ã
const f2b = (x) => new Uint8Array(new Float64Array([x]).buffer);
const b2f = (x) => new Float64Array(x.buffer)[0];
// åå¾ NaN çä½å
çµè¡¨ç¤º
const n = f2b(NaN);
const m = f2b(NaN);
// æ¹è®ç¬¦èä½å
ï¼éå° NaN ä¾èªªç¡éç·è¦
n[7] += 2 ** 7;
// n[0] += 2**7; éå°å¤§ç«¯åºèçå¨
const nan2 = b2f(n);
console.log(nan2); // NaN
console.log(Object.is(nan2, NaN)); // true
console.log(f2b(NaN)); // Uint8Array(8) [0, 0, 0, 0, 0, 0, 248, 127]
console.log(f2b(nan2)); // Uint8Array(8) [0, 0, 0, 0, 0, 0, 248, 255]
// æ¹è®ç¬¬ä¸åä½å
ï¼éæ¯å°¾æ¸çæä½ææä½å
ï¼å° NaN ä¾èªªç¡éç·è¦
m[0] = 1;
// m[7] = 1; éå°å¤§ç«¯åºèçå¨
const nan3 = b2f(m);
console.log(nan3); // NaN
console.log(Object.is(nan3, NaN)); // true
console.log(f2b(NaN)); // Uint8Array(8) [0, 0, 0, 0, 0, 0, 248, 127]
console.log(f2b(nan3)); // Uint8Array(8) [1, 0, 0, 0, 0, 0, 248, 127]
éé»é¿é NaN
NaN æé鿏å¸éç®å³æï¼å æ¤é常åªéå¨è¨ç®çµæææ¸¬è©¦ä¸æ¬¡ NaN å³å¯åµæ¸¬é¯èª¤æ
æ³ãå¯ä¸æéé»é¿é NaN çæ
æ³æ¯ä½¿ç¨ææ¸çº 0 çææ¸éç®æï¼å®æç«å³åå³ 1 è䏿¸¬è©¦åºæ¸çå¼ã
NaN ** 0 === 1; // true
è¦ç¯
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-value-properties-of-the-global-object-nan> |