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 ìì±ì Not-A-Number(ì«ìê° ìë)를 ëíë
ëë¤.
ìëí´ ë³´ê¸°
function sanitize(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
console.log(sanitize("1"));
// Expected output: "1"
console.log(sanitize("NotANumber"));
// Expected output: NaN
ê°
Number.NaNì ëì¼í ì«ì ê°ì
ëë¤.
Property attributes of 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ì´ ì ì¼ì± ìë¤ë ê²ì ì미í©ëë¤. - ì í¨íì§ ìì ê°ì´ ì«ìë¡ íìëë 기í ê²½ì° (ìì: ì못ë ë ì§
new Date("blabla").getTime(),"".charCodeAt(1))
NaNê³¼ NaNì ëìì JavaScriptìì ë°ëª
í ê²ì´ ìëëë¤. ë¶ë ììì ì°ì ì ì미(NaN !== NaN í¬í¨)ë IEEE 754ì ìí´ ì§ì ë©ëë¤. NaNì ëìì ë¤ìê³¼ ê°ìµëë¤.
NaNì´ ìí ì°ì°ì í¬í¨ë ê²½ì° (ê·¸ë¬ë ë¹í¸ ì°ì°ë ìë) ê²°ê³¼ë ì¼ë°ì ì¼ë¡NaNì ëë¤. (ìëì counter-example 참조)NaNì´ ê´ê³ ë¹êµ(>,<,>=,<=)ì í¼ì°ì°ì ì¤ íëì¸ ê²½ì° ê²°ê³¼ë íìfalseì ëë¤.NaNì (==,!=,===ë°!==를 íµí´) ë¤ë¥¸NaNê°ì í¬í¨íì¬ ë¤ë¥¸ ê°ê³¼ ê°ì§ ìì ê²ì¼ë¡ ë¹êµë©ëë¤.
NaNì JavaScriptì falsy ê° ì¤ íëì´ê¸°ë í©ëë¤.
ìì
>NaN íë³
ê°ì´ NaNì¸ì§ íì¸íë ¤ë©´, Number.isNaN() ëë isNaN()를 ì¬ì©íì¬ ê°ì´ NaNì¸ì§ ì¬ë¶ë¥¼ íì¸ í ì ììµëë¤. ëë NaNì ìì ê³¼ ê°ì§ ìë¤ê³ ë¹êµëë ì ì¼í ê°ì´ë¯ë¡ x !== xì ê°ì ìì²´ ë¹êµë¥¼ ìíí ì ììµëë¤.
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
function valueIsNaN(v) {
return v !== v;
}
valueIsNaN(1); // false
valueIsNaN(NaN); // true
valueIsNaN(Number.NaN); // true
ê·¸ë¬ë isNaN()ê³¼ Number.isNaN()ì ì°¨ì´ë¥¼ ì ìí´ì¼ í©ëë¤. isNaNì íì¬ ê°ì´ NaNì´ê±°ë, ì«ìë¡ ë³ííì ë NaNì´ ëë©´ ì°¸ì ë°ííì§ë§, Number.isNaNì íì¬ ê°ì´ NaNì´ì´ì¼ë§ ì°¸ì ë°íí©ëë¤.
isNaN("hello world"); // true
Number.isNaN("hello world"); // false
ê°ì ì´ì ë¡ BigInt ê°ì ì¬ì©íë©´ Number.isNaN()ì´ ìë 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ì 0ì´ ìë ê°ìë¶ê° ìë ë¶ë ììì ì«ìë NaNì´ê¸° ë문ì ìë¡ ë¤ë¥¸ ì´ì§ ííì ê°ì§ ë ê°ì ë¶ë ììì ì«ì를 ìì±í ì ìì§ë§ ë ë¤ NaNì
ëë¤. JavaScriptìì typed arrays를 ì¬ì©íì¬ ë¹í¸ ìì¤ ì¡°ìì ìíí ì ììµëë¤.
const f2b = (x) => new Uint8Array(new Float64Array([x]).buffer);
const b2f = (x) => new Float64Array(x.buffer)[0];
// NaNì byte ííì ê°ì ¸ìµëë¤.
const n = f2b(NaN);
// ë¶í¸ ë¹í¸ì´ê³ NaNì ì¤ìíì§ ìì 첫 ë²ì§¸ ë¹í¸ë¥¼ ë³ê²½í©ëë¤.
n[0] = 1;
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) [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> |