JavaScript æä¾ä¸ç§ä¸åç弿¯è¾è¿ç®ï¼
===
ââä¸¥æ ¼ç¸çï¼ä¸ä¸ªçå·ï¼==
ââ宽æ¾ç¸çï¼ä¸¤ä¸ªçå·ï¼Object.is()
éæ©åªç§è¿ç®åå³äºä½ éè¦ä»ä¹æ ·çæ¯è¾ãç®åæ¥è¯´ï¼
==
ï¼å°æ§è¡ç±»å转æ¢ï¼å¹¶ä¸ä¼æç
§ IEEE 754 æ å对 NaN
ã-0
å +0
è¿è¡ç¹æ®å¤çï¼æ
NaN != NaN
ï¼ä¸ -0 == +0
ï¼ï¼===
ï¼åçæ¯è¾ä¸åçå·ç¸åï¼å
æ¬å¯¹ NaN
ã-0
å +0
çç¹æ®å¤çï¼ä½ä¸è¿è¡ç±»å转æ¢ï¼å¦æç±»åä¸åï¼åè¿å false
ï¼Object.is()
æ¢ä¸è¿è¡ç±»å转æ¢ï¼ä¹ä¸å¯¹ NaN
ã-0
å +0
è¿è¡ç¹æ®å¤çï¼è¿ä½¿å®å ===
å¨é¤äºé£äºç¹æ®æ°åå¼ä¹å¤çæ
åµå
·æç¸åç表ç°ï¼ãä¸è¿°ä¸ä¸ªæä½åå«ä¸ JavaScript å个ç¸çç®æ³ä¸çä¸ä¸ªç¸å¯¹åºï¼
==
===
Object.is()
请注æï¼è¿äºç®æ³çåºå«é½ä¸å®ä»¬å¯¹åå§å¼çå¤çæå
³ï¼å®ä»¬é½ä¸ä¼æ¯è¾åæ°æ¯å¦å
·ææ¦å¿µä¸ç¸ä¼¼çç»æã对äºä»»ä½å
·æç¸åçç»æãä½ä¸æ¯åä¸å¯¹è±¡çéåå§ç±»å对象 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
å
·æç¸åçè¯ä¹ï¼é¤äºè½¬æ¢çåºç¨é¡ºåºï¼ãä½¿ç¨ ==
æ§è¡å®½æ¾ç¸ççè¡ä¸ºå¦ä¸ï¼
true
ãtrue
ãtrue
ã+0
å -0
被è§ä¸ºç¸åçå¼ã妿任ä½ä¸ä¸ªæä½æ°æ¯ NaN
ï¼è¿å false
ï¼æä»¥ï¼NaN
æ°¸è¿ä¸çäº NaN
ãtrue
æé½ä¸º false
æ¶è¿å true
ãtrue
ãtrue
ãnull
æ undefined
ï¼å¦ä¸ä¸ªæä½æ°ä¹å¿
须为 null
æ undefined
以è¿å true
ãå¦åè¿å false
ãfalse
ãtrue
转æ¢ä¸º 1ï¼false
转æ¢ä¸º 0ãç¶å忬¡å¯¹ä¸¤ä¸ªæä½æ°è¿è¡å®½æ¾æ¯è¾ãNaN
ï¼è¿å°ä¿è¯ç¸çæ¯è¾ä¸º false
ã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
宽æ¾ç¸çä»
ç± ==
è¿ç®ç¬¦ä½¿ç¨ã
åå¼ç¸çå³å®äºä¸¤ä¸ªå¼å¨ææä¸ä¸æä¸æ¯å¦å¨åè½ä¸ç¸åãï¼è¿ä¸ªç¨ä¾æ¼ç¤ºäºéæ°æ¿æ¢ååçä¸ç§æ åµãï¼è¿ä¸æ åµä¼å¨å°è¯ä¿®æ¹ä¸ä¸ªä¸å¯å屿§æ¶åçã
// å Nmuber æé 彿°æ·»å ä¸ä¸ªä¸å¯åç屿§ 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
å¿
é¡»æ ¹æ®å
¶ç¹å®ç¹å¾æ¥èèï¼è䏿¯æ ¹æ®å
¶ç¸çè¿ç®ç¬¦ç宽æ¾åº¦æä¸¥æ ¼åº¦æ¥èèã
==
===
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
ä¹é´å·®å¼çå
ç½®æ¹æ³åè¿ç®ç¬¦ï¼
-
ï¼ä¸å
åï¼
注æä¸é¢ç示ä¾ï¼
const 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
çå®ä¾è§ä¸ºåä¸å¯¹è±¡ãç¶èï¼ç±äºå¯ä»¥ä½¿ç¨ç±»ååæ°ç»ï¼æä»¬å¯ä»¥æ¥æ 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]
åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4