ç¸çæ¯è¾åç¸å
JavaScript æä¾ä¸ç§ä¸åç弿¯è¾è¿ç®ï¼
===ââä¸¥æ ¼ç¸çï¼ä¸ä¸ªçå·ï¼==ââ宽æ¾ç¸çï¼ä¸¤ä¸ªçå·ï¼Object.is()
éæ©åªç§è¿ç®åå³äºä½ éè¦ä»ä¹æ ·çæ¯è¾ãç®åæ¥è¯´ï¼
- 卿¯è¾ä¸¤ä¸ªæä½æ°æ¶ï¼åçå·ï¼
==ï¼å°æ§è¡ç±»å转æ¢ï¼å¹¶ä¸ä¼æç § IEEE 754 æ å对NaNã-0å+0è¿è¡ç¹æ®å¤çï¼æNaN != NaNï¼ä¸-0 == +0ï¼ï¼ - ä¸çå·ï¼
===ï¼åçæ¯è¾ä¸åçå·ç¸åï¼å æ¬å¯¹NaNã-0å+0çç¹æ®å¤çï¼ä½ä¸è¿è¡ç±»å转æ¢ï¼å¦æç±»åä¸åï¼åè¿åfalseï¼ Object.is()æ¢ä¸è¿è¡ç±»å转æ¢ï¼ä¹ä¸å¯¹NaNã-0å+0è¿è¡ç¹æ®å¤çï¼è¿ä½¿å®å===å¨é¤äºé£äºç¹æ®æ°åå¼ä¹å¤çæ åµå ·æç¸åç表ç°ï¼ã
ä¸è¿°ä¸ä¸ªæä½åå«ä¸ JavaScript å个ç¸çç®æ³ä¸çä¸ä¸ªç¸å¯¹åºï¼
- IsLooselyEqualï¼
== - IsStrictlyEqualï¼
=== - SameValueï¼
Object.is() - SameValueZeroï¼è¢«è®¸å¤å ç½®è¿ç®ä½¿ç¨
请注æï¼è¿äºç®æ³çåºå«é½ä¸å®ä»¬å¯¹åå§å¼çå¤çæå
³ï¼å®ä»¬é½ä¸ä¼æ¯è¾åæ°æ¯å¦å
·ææ¦å¿µä¸ç¸ä¼¼çç»æã对äºä»»ä½å
·æç¸åçç»æãä½ä¸æ¯åä¸å¯¹è±¡çéåå§ç±»å对象 x å y ï¼ä¸è¿°ææå½¢å¼é½å°è®¡ç®ä¸º falseã
ä½¿ç¨ === è¿è¡ä¸¥æ ¼ç¸çæ¯è¾
ä¸¥æ ¼ç¸çæ¯è¾ä¸¤ä¸ªå¼æ¯å¦ç¸çã两个被æ¯è¾çå¼å¨æ¯è¾åé½ä¸è¿è¡éå¼è½¬æ¢ãå¦æä¸¤ä¸ªè¢«æ¯è¾çå¼å
·æä¸åçç±»åï¼å认为è¿ä¸¤ä¸ªå¼ä¸ç¸çãå¦æä¸¤ä¸ªè¢«æ¯è¾çå¼ç±»åç¸åï¼å¼ä¹ç¸åï¼å¹¶ä¸é½ä¸æ¯ number ç±»åæ¶ï¼å认为è¿ä¸¤ä¸ªå¼ç¸çãæåï¼å¦æä¸¤ä¸ªå¼é½æ¯ number ç±»åï¼å½ä¸¤ä¸ªé½ä¸æ¯ NaNï¼å¹¶ä¸æ°å¼ç¸åï¼ææ¯ä¸¤ä¸ªå¼åå«ä¸º +0 å -0 æ¶ï¼ä¸¤ä¸ªå¼è¢«è®¤ä¸ºæ¯ç¸ççã
const num = 0;
const obj = new String("0");
const str = "0";
console.log(num === num); // true
console.log(obj === obj); // true
console.log(str === str); // true
console.log(num === obj); // false
console.log(num === str); // false
console.log(obj === str); // false
console.log(null === undefined); // false
console.log(obj === null); // false
console.log(obj === undefined); // false
使ç¨ä¸¥æ ¼ç¸çå 乿»æ¯æ£ç¡®çéæ©ã对äºé¤äºæ°åä¹å¤çå¼ï¼ä¸¥æ ¼ç¸çæçæç¡®çè¯ä¹ï¼å¼ä»
ä¸å®èªèº«ç¸çãå¯¹äºæ°åï¼ä¸¥æ ¼ç¸ç使ç¨ç¨å¾®ä¸åçè¯ä¹å¤çä¸¤ä¸ªç¹æ®æ
åµï¼ç¬¬ä¸ä¸ªæ
嵿¯ï¼æµ®ç¹æ° 0 æ¯ä¸åæ£è´çãåºå +0 å -0 å¨è§£å³ä¸äºç¹å®çæ°å¦é®é¢æ¶åºåæ£è´æ¯å¿
è¦çï¼ä½æ¯å¤§é¨åæ
åµä¸æä»¬å¹¶ä¸ç¨å
³å¿ãä¸¥æ ¼ç¸ç认为è¿ä¸¤ä¸ªå¼æ¯å
¨ççã第äºä¸ªæ
嵿¯ï¼æµ®ç¹æ°å
å«äº NaN å¼ï¼ç¨æ¥è¡¨ç¤ºæäºå®ä¹ä¸æç¡®çæ°å¦é®é¢çè§£ï¼ä¾å¦ï¼æ£æ ç©·å è´æ ç©·ãä¸¥æ ¼ç¸ç认为 NaN ä¸å
¶ä»ä»»ä½å¼é½ä¸å
¨çï¼å
æ¬å®èªå·±ãï¼çå¼ (x !== x) æç«çå¯ä¸æ
嵿¯ x çå¼ä¸º NaNï¼
é¤äº === ä¹å¤ï¼æ°ç»ç´¢å¼æ¥æ¾æ¹æ³ä¹ä½¿ç¨ä¸¥æ ¼ç¸çï¼å
æ¬ Array.prototype.indexOf()ãArray.prototype.lastIndexOf()ãTypedArray.prototype.index()ãTypedArray.prototype.lastIndexOf() å case å¹é
ãè¿æå³çä½ ä¸è½ä½¿ç¨ indexOf(NaN) æ¥æ¾æ°ç»ä¸ NaN å¼çç´¢å¼ï¼ä¹ä¸è½å° NaN ç¨ä½ case å¼å¨ switch è¯å¥ä¸å¹é
ä»»ä½å
容ã
console.log([NaN].indexOf(NaN)); // -1
switch (NaN) {
case NaN:
console.log("Surprise"); // 没æä»»ä½è¾åº
}
ä½¿ç¨ == è¿è¡å®½æ¾ç¸çæ¯è¾
宽æ¾ç¸çæ¯å¯¹ç§°çï¼å¯¹äºä»»ä½ A å B çå¼ï¼A == B æ»æ¯ä¸ B == A å
·æç¸åçè¯ä¹ï¼é¤äºè½¬æ¢çåºç¨é¡ºåºï¼ãä½¿ç¨ == æ§è¡å®½æ¾ç¸ççè¡ä¸ºå¦ä¸ï¼
- 妿æä½æ°å
·æç¸åçç±»åï¼åæå¦ä¸æ¹å¼è¿è¡æ¯è¾ï¼
- 对象ï¼Objectï¼ï¼ä»
å½ä¸¤ä¸ªæä½æ°å¼ç¨åä¸ä¸ªå¯¹è±¡æ¶è¿å
trueã - å符串ï¼Stringï¼ï¼ä»
å½ä¸¤ä¸ªæä½æ°å
·æç¸åçå符ä¸é¡ºåºç¸åæ¶è¿å
trueã - æ°åï¼Numberï¼ï¼å¦æä¸¤ä¸ªæä½æ°çå¼ç¸åï¼åè¿å
trueã+0å-0被è§ä¸ºç¸åçå¼ã妿任ä½ä¸ä¸ªæä½æ°æ¯NaNï¼è¿åfalseï¼æä»¥ï¼NaNæ°¸è¿ä¸çäºNaNã - å¸å°å¼ï¼Booleanï¼ï¼ä»
彿使°é½ä¸º
trueæé½ä¸ºfalseæ¶è¿åtrueã - 大æ´åï¼BigIntï¼ï¼ä»
å½ä¸¤ä¸ªæä½æ°çå¼ç¸åæ¶è¿å
trueã - 符å·ï¼Symbolï¼ï¼ä»
å½ä¸¤ä¸ªæä½æ°å¼ç¨ç¸åçç¬¦å·æ¶è¿å
trueã
- 对象ï¼Objectï¼ï¼ä»
å½ä¸¤ä¸ªæä½æ°å¼ç¨åä¸ä¸ªå¯¹è±¡æ¶è¿å
- 妿å
¶ä¸ä¸ä¸ªæä½æ°ä¸º
nullæundefinedï¼å¦ä¸ä¸ªæä½æ°ä¹å¿ 须为nullæundefined以è¿åtrueãå¦åè¿åfalseã - å¦æå ¶ä¸ä¸ä¸ªæä½æ°æ¯å¯¹è±¡ï¼å¦ä¸ä¸ªæ¯åå§å¼ï¼åå°å¯¹è±¡è½¬æ¢ä¸ºåå§å¼ã
- å¨è¿ä¸æ¥ï¼ä¸¤ä¸ªæä½æ°é½è¢«è½¬æ¢ä¸ºåå§å¼ï¼åç¬¦ä¸²ãæ°åãå¸å°å¼ã符å·å大æ´åä¸çä¸ä¸ªï¼ãå©ä½ç转æ¢å°åæ
åµå®æã
- 妿æ¯ç¸åçç±»åï¼ä½¿ç¨æ¥éª¤ 1 è¿è¡æ¯è¾ã
- 妿å
¶ä¸ä¸ä¸ªæä½æ°æ¯ç¬¦å·èå¦ä¸ä¸ªä¸æ¯ï¼è¿å
falseã - 妿å
¶ä¸ä¸ä¸ªæä½æ°æ¯å¸å°å¼èå¦ä¸ä¸ªä¸æ¯ï¼åå°å¸å°å¼è½¬æ¢ä¸ºæ°åï¼
true转æ¢ä¸º 1ï¼false转æ¢ä¸º 0ãç¶å忬¡å¯¹ä¸¤ä¸ªæä½æ°è¿è¡å®½æ¾æ¯è¾ã - æ°åä¸å符串ï¼å°å符串转æ¢ä¸ºæ°åã转æ¢å¤±è´¥çç»æä¸º
NaNï¼è¿å°ä¿è¯ç¸çæ¯è¾ä¸ºfalseã - æ°åä¸å¤§æ´åï¼ææ°åçå¼è¿è¡æ¯è¾ã妿æ°å为 ±Infinity æ
NaNï¼è¿åfalseã - å符串ä¸å¤§æ´åï¼ä½¿ç¨ä¸
BigInt()æé 彿°ç¸åçç®æ³å°å符串转æ¢ä¸ºå¤§æ´åæ°ãå¦æè½¬æ¢å¤±è´¥ï¼è¿åfalseã
ä¸ç´ä»¥æ¥ï¼æ ¹æ® ECMAScript è§èï¼ææåå§å¼å对象é½ä¸ä¸ undefined å null 宽æ¾ç¸çã使¯å¤§é¨åæµè§å¨å
许é常æéçä¸ç±»å¯¹è±¡ï¼å³ï¼ææé¡µé¢ä¸ç document.all 对象ï¼å¨æäºæ
åµä¸è¡¨ç°åºæ¨¡æ undefined å¼ç¹æ§ã宽æ¾ç¸çå°±æ¯è¿äºæ
åµä¹ä¸ï¼å½ä¸ä»
å½ A æ¯ä¸ä¸ªæ¨¡æ undefined ç对象æ¶ï¼null == A å undefined == A å°ä¼è®¡ç®å¾å° trueãå¨å
¶ä»æææ
åµä¸ï¼ä¸ä¸ªå¯¹è±¡é½ä¸ä¼ä¸ undefined æ null 宽æ¾ç¸çã
å¨å¤§å¤æ°æ åµä¸ï¼ä¸å»ºè®®ä½¿ç¨å®½æ¾ç¸çã使ç¨ä¸¥æ ¼ç¸çè¿è¡æ¯è¾çç»ææ´å®¹æé¢æµï¼å¹¶ä¸ç±äºç¼ºå°ç±»å强å¶è½¬æ¢å¯ä»¥æ´å¿«å°æ§è¡ã
ä¸é¢çä¾åæ¼ç¤ºäºå®½æ¾æ¯è¾ï¼å
¶ä¸æ¶å number åå§å¼ 0ãbigint åå§å¼ 0nãstring åå§å¼ '0' åä¸ä¸ª toString() å¼ä¸º '0' ç对象ã
const num = 0;
const big = 0n;
const str = "0";
const obj = new String("0");
console.log(num == str); // true
console.log(big == num); // true
console.log(str == big); // true
console.log(num == obj); // true
console.log(big == obj); // true
console.log(str == obj); // true
宽æ¾ç¸çä»
ç± == è¿ç®ç¬¦ä½¿ç¨ã
ä½¿ç¨ Object.is() è¿è¡åå¼ç¸çæ¯è¾
åå¼ç¸çå³å®äºä¸¤ä¸ªå¼å¨ææä¸ä¸æä¸æ¯å¦å¨åè½ä¸ç¸åãï¼è¿ä¸ªç¨ä¾æ¼ç¤ºäºéæ°æ¿æ¢ååçä¸ç§æ åµãï¼è¿ä¸æ åµä¼å¨å°è¯ä¿®æ¹ä¸ä¸ªä¸å¯å屿§æ¶åçã
// å Number æé 彿°æ·»å ä¸ä¸ªä¸å¯åç屿§ NEGATIVE_ZERO
Object.defineProperty(Number, "NEGATIVE_ZERO", {
value: -0,
writable: false,
configurable: false,
enumerable: false,
});
function attemptMutation(v) {
Object.defineProperty(Number, "NEGATIVE_ZERO", { value: v });
}
å½å°è¯æ´æ¹ä¸å¯å屿§æ¶ï¼Object.defineProperty 伿åºå¼å¸¸ï¼ä½å¦ææ²¡æè¯·æ±å®é
æ´æ¹ï¼åä¸ä¼æ§è¡ä»»ä½æä½ã妿 v æ¯ -0ï¼å没æè¯·æ±æ´æ¹ï¼ä¹ä¸ä¼æåºé误ãå¨å
é¨ï¼éæ°å®ä¹ä¸å¯å屿§æ¶ï¼ä½¿ç¨åå¼ç¸çå°æ°æå®çå¼ä¸å½åå¼è¿è¡æ¯è¾ã
åå¼ç¸çç± Object.is æ¹æ³æä¾ãè¯è¨å
鍿æä¸ä¸ªå¼çäºå¦ä¸ä¸ªæ¶ï¼å 乿æå°æ¹é½ä½¿ç¨åå¼ç¸çã
é¶å¼ç¸ç
类似äºåå¼ç¸çï¼ä½ +0 å -0 被è§ä¸ºç¸çã
é¶å¼ç¸çä¸ä½ä¸º JavaScript API å ¬å¼ï¼ä½å¯ä»¥éè¿èªå®ä¹ä»£ç å®ç°ï¼
function sameValueZero(x, y) {
if (typeof x === "number" && typeof y === "number") {
// x å y ç¸çï¼å¯è½æ¯ -0 å 0ï¼æå®ä»¬é½æ¯ NaN
return x === y || (x !== x && y !== y);
}
return x === y;
}
é¶å¼ç¸çä¸ä¸¥æ ¼ç¸ççåºå«å¨äºå
¶å° NaN è§ä½æ¯ç¸ççï¼ä¸åå¼ç¸ççåºå«å¨äºå
¶å° -0 å 0 è§ä½ç¸ççãè¿ä½¿å¾å®å¨æç´¢æé´é常å
·ææå®ç¨çè¡ä¸ºï¼ç¹å«æ¯å¨å¤ç NaN æ¶ãå®è¢«ç¨äº Array.prototype.includes()ãTypedArray.prototype.includes()ï¼ä»¥å Map å Set çéè¦æ¯è¾é®çç¸çæ§çæ¹æ³ã
ç¸çæ§æ¹æ³æ¯è¾
卿¯è¾åçå·åä¸çå·æ¶ï¼äººä»¬é常说ä¸ä¸ªæ¯å¦ä¸ä¸ªçâå¢å¼ºâçæ¬ãä¾å¦ï¼åçå·å¯ä»¥è¢«ç§°ä¸ºä¸çå·çæ©å±çæ¬ï¼å 为åè
å¯ä»¥æ§è¡åè
çæææä½ï¼ä½æ¯ä¼å¯¹å
¶æä½æ°è¿è¡ç±»å转æ¢ââä¾å¦ 6 == "6"ãæè
ï¼ä¹å¯ä»¥è¯´åçå·æ¯åºç¡ï¼èä¸çå·æ¯å¢å¼ºçæ¬ï¼å 为å®è¦æ±ä¸¤ä¸ªæä½æ°æ¯ç¸åçç±»åï¼å æ¤å¢å äºé¢å¤ç约æã
ç¶èï¼è¿ç§æç»´æ¹å¼æå³çç¸çæ¯è¾å½¢æäºä¸ä¸ªä¸ç»´çâå
è°±âï¼å
¶ä¸âå®å
¨ä¸¥æ ¼âä½äºä¸ç«¯ï¼âå®å
¨å®½æ¾âä½äºå¦ä¸ç«¯ãè¿ä¸ªæ¨¡å对 Object.is èè¨åå¨ç¼ºé·ï¼å ä¸ºå®æ¢ä¸æ¯åçå·â宽æ¾âï¼ä¹ä¸æ¯ä¸çå·âä¸¥æ ¼âï¼ä¹ä¸å¤äºä¸¤è
ä¹é´ï¼å¯ä»¥è¯´æ¢æ¯åçå·ä¸¥æ ¼ï¼åæ¯ä¸çå·å®½æ¾ï¼ãä»ä¸é¢çç¸åæ¯è¾è¡¨ä¸ï¼æä»¬å¯ä»¥çåºè¿æ¯ç±äº Object.is å¤ç NaN çæ¹å¼ã请注æï¼å¦æ Object.is(NaN, NaN) æ±å¼å¾å° falseï¼æä»¬å¯ä»¥è¯´å®éå宽æ¾/ä¸¥æ ¼å
è°±ï¼ä½ä¸ºä¸çå·çæ´ä¸¥æ ¼å½¢å¼ï¼å¯ä»¥åºå -0 å +0 ãç¶èï¼NaN çå¤çæå³çè¿æ¯ä¸æ£ç¡®çãä¸å¹¸çæ¯ï¼Object.is å¿
é¡»æ ¹æ®å
¶ç¹å®ç¹å¾æ¥èèï¼è䏿¯æ ¹æ®å
¶ç¸çè¿ç®ç¬¦ç宽æ¾åº¦æä¸¥æ ¼åº¦æ¥èèã
| x | y | == |
=== |
Object.is |
SameValueZero |
|---|---|---|---|---|---|
undefined |
undefined |
â
true |
â
true |
â
true |
â
true |
null |
null |
â
true |
â
true |
â
true |
â
true |
true |
true |
â
true |
â
true |
â
true |
â
true |
false |
false |
â
true |
â
true |
â
true |
â
true |
'foo' |
'foo' |
â
true |
â
true |
â
true |
â
true |
0 |
0 |
â
true |
â
true |
â
true |
â
true |
+0 |
-0 |
â
true |
â
true |
â false |
â
true |
+0 |
0 |
â
true |
â
true |
â
true |
â
true |
-0 |
0 |
â
true |
â
true |
â false |
â
true |
0n |
-0n |
â
true |
â
true |
â
true |
â
true |
0 |
false |
â
true |
â false |
â false |
â false |
"" |
false |
â
true |
â false |
â false |
â false |
"" |
0 |
â
true |
â false |
â false |
â false |
'0' |
0 |
â
true |
â false |
â false |
â false |
'17' |
17 |
â
true |
â false |
â false |
â false |
[1, 2] |
'1,2' |
â
true |
â false |
â false |
â false |
new String('foo') |
'foo' |
â
true |
â false |
â false |
â false |
null |
undefined |
â
true |
â false |
â false |
â false |
null |
false |
â false |
â false |
â false |
â false |
undefined |
false |
â false |
â false |
â false |
â false |
{ foo: 'bar' } |
{ foo: 'bar' } |
â false |
â false |
â false |
â false |
new String('foo') |
new String('foo') |
â false |
â false |
â false |
â false |
0 |
null |
â false |
â false |
â false |
â false |
0 |
NaN |
â false |
â false |
â false |
â false |
'foo' |
NaN |
â false |
â false |
â false |
â false |
NaN |
NaN |
â false |
â false |
â
true |
â
true |
使¶ä½¿ç¨ Object.is() è䏿¯ä¸çå·
é常æ
åµä¸ï¼å¯ä¸éè¦å
³æ³¨ Object.is 对é¶çç¹æ®è¡ä¸ºçæ¶æºæ¯å¨å®æ½ç¹å®çå
ç¼ç¨è弿¶ï¼ç¹å«æ¯æ¶å屿§æè¿°ç¬¦æ¶ï¼å½ä½ çå·¥ä½éè¦éå Object.defineProperty çæäºç¹æ§æ¶ãå¦æä½ çç¨ä¾ä¸éè¦è¿æ ·åï¼å»ºè®®é¿å
ä½¿ç¨ Object.isï¼èæ¹ç¨ ===ãå³ä½¿ä½ çè¦æ±æ¶åå°ä¸¤ä¸ª NaN å¼ä¹é´çæ¯è¾è®¡ç®ä¸º trueï¼éå¸¸ç¹æ®å¤ç NaN æ£æ¥ï¼ä½¿ç¨å
åçæ¬ç ECMAScript 䏿ä¾ç isNaN æ¹æ³ï¼æ¯è§£å³ç¸å
³è®¡ç®å¦ä½å½±åé¶çç¬¦å·æ´ä¸ºç®åã
è¿æ¯ä¸ä¸ªä¸å
¨é¢çå表ï¼å
¶ä¸å
å«å¯è½å¯¼è´ä½ ç代ç ä¸åºç° -0 å +0 ä¹é´å·®å¼çå
ç½®æ¹æ³åè¿ç®ç¬¦ï¼
-ï¼ä¸å åï¼-
注æä¸é¢ç示ä¾ï¼
jsconst stoppingForce = obj.mass * -obj.velocity;妿
obj.velocityæ¯0ï¼æè®¡ç®ä¸º0ï¼ï¼åå¨è¯¥ä½ç½®å¼å ¥-0å¹¶åstoppingForceä¼ æã Math.atan2ãMath.ceilãMath.powãMath.round-
å¨æäºæ åµä¸ï¼å³ä½¿æ²¡æ
-0ä½ä¸ºåæ°ä¹ä¸ï¼è¿äºæ¹æ³çè¿åå¼ä»å¯è½ä½ä¸ºè¡¨è¾¾å¼ä¸ç-0被å¼å ¥ãä¾å¦ï¼ä½¿ç¨Math.powå°-Infinityçä»»ä½è´å¥æ°æ¬¡å¹æ±å¼ä¸º-0ã请åé åä¸ªæ¹æ³çææ¡£ã Math.floorãMath.maxãMath.minãMath.sinãMath.sqrtãMath.tan-
å¨æäºæ åµä¸ï¼å½åæ°ä¸åå¨
-0æ¶ï¼è¿äºæ¹æ³å¯è½ä¼è¿åä¸ä¸ª-0å¼ãä¾å¦ï¼Math.min(-0, +0)ç计ç®ç»æä¸º-0ã请åèåä¸ªæ¹æ³çææ¡£ã ~ã<<ã>>-
è¿äºè¿ç®ç¬¦ä¸çæ¯ä¸ä¸ªé½å¨å é¨ä½¿ç¨ ToInt32 ç®æ³ãç±äºå¨å é¨ 32 使´æ°ç±»åä¸åªæä¸ä¸ªè¡¨ç¤º 0 ç表示形å¼ï¼
-0å¨ååæä½åå°ä¸ä¼åå¨ãä¾å¦ï¼Object.is(~~(-0), -0)åObject.is(-0 << 2 >> 2, -0)é½ä¼è®¡ç®ä¸ºfalseã
妿ä¸èèé¶ç符å·ï¼ä¾èµäº Object.is å¯è½ä¼å¾å±é©ã彿å¾åºå -0 å +0 æ¶ï¼å®å½ç¶ä¼åå°ææçææã
注æï¼Object.is() å NaN
Object.is è§èå°ææ NaN çå®ä¾è§ä¸ºåä¸å¯¹è±¡ãç¶èï¼ç±äºå¯ä»¥ä½¿ç¨ç±»ååæ°ç»ï¼æä»¬å¯ä»¥æ¥æ NaN çä¸åæµ®ç¹è¡¨ç¤ºï¼è¿äºè¡¨ç¤ºå¨ææä¸ä¸æä¸çè¡ä¸ºä¸å®å
¨ç¸åãä¾å¦ï¼
const f2b = (x) => new Uint8Array(new Float64Array([x]).buffer);
const b2f = (x) => new Float64Array(x.buffer)[0];
// å¾å° NaN çåè表示
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]