ç価æ§ã®æ¯è¼ã¨å䏿§
JavaScript ã«ã¯ãç°ãªãå¤ã®æ¯è¼æ¼ç®ã 3 ã¤ããã¾ãã
===â å³å¯ãªç価æ§ï¼ä¸éçå·ï¼==â ç·©ãç価æ§ï¼äºéçå·ï¼Object.is()
ã©ã®æ¼ç®åã使ç¨ãããã¯ãã©ã®ãããªæ¯è¼ãè¡ããããã«ä¾åãã¾ããç°¡åã«è¨ãã°ã
- äºéçå· (
==) 㯠2 ã¤ã®ãã®ãæ¯è¼ããåã«å夿ãå®è¡ããNaN,-0,+0ã IEEE 754 ã«æºæ ãã¦ç¹å¥æ±ããã¾ãï¼ãã£ã¦NaN != NaN,-0 == +0ã«ãªãã¾ãï¼ã - ä¸éçå· (
===) ã¯äºéçå·ã¨åãæ¯è¼ãï¼NaN,-0,+0ã®ç¹å¥æ±ããå«ãã¦ï¼ãã¾ãããå夿ãè¡ãã¾ãããããåãç°ãªãã°ãfalseãè¿ããã¾ãã Object.is()ã¯å夿ãè¡ãããNaN,-0,+0ã®ç¹å¥æ±ãããã¾ããï¼ãããã®ç¹æ®ãªæ°å¤ãé¤ãã¦===ã¨åãåä½ããã¾ãï¼ã
ãããã¯ãJavaScript ã«ããã 4 ã¤ã®ç価æ§ã¢ã«ã´ãªãºã ã®ãã¡ã3 ã¤ã«å¯¾å¿ãã¾ãã
- IsLooselyEqual:
== - IsStrictlyEqual:
=== - SameValue:
Object.is() - SameValueZero: å¤ãã®çµã¿è¾¼ã¿æä½ã§ä½¿ç¨ããã
ãªãããããã®åºå¥ã¯ããªããã£ãå¤ã®æ±ãã«ã¤ãã¦ã®ãã¨ã§ãããããã®å ´åã弿°ãæ¦å¿µçã«ä¼¼ãæ§é ãæã¤ãã©ãããæ¯è¼ãã訳ã§ã¯ããã¾ãããããªããã£ãå¤ã§ã¯ãªã x ããã³ y ãªãã¸ã§ã¯ããåä¸ã®æ§é ãæã£ã¦ãã¦ããªãã¸ã§ã¯ããç°ãªãã°ãä¸è¨ã®ãããã®å½¢ã§ã false ã¨è©ä¾¡ããã¾ãã
=== ã«ããå³å¯ãªç価æ§
å³å¯ãªç価æ§ã¯ã2 ã¤ã®å¤ãçãããæ¯è¼ãã¾ããæ¯è¼å¯¾è±¡ã®å¤ã¯ã©ã¡ãããæ¯è¼ããåã«å¥ã®å¤ã¸æé»ã®ãã¡ã«å¤æããããã¨ã¯ããã¾ãããå¤ãç°ãªãåã®å ´åããããã®å¤ã¯çãããªãã¨ã¿ãªãã¾ããå¤ãåãåã§æ°å¤ã§ã¯ãªãå ´åãåãå¤ã§ããã°çããã¨ã¿ãªãã¾ããæå¾ã«ãã©ã¡ãã®å¤ãæ°å¤ã§ããå ´åãã©ã¡ãã 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) ã true ã«ãªãå¯ä¸ã®å ´å㯠x ã NaN ã§ããå ´åã§ããï¼
ã¾ãã=== 以å¤ã«ãå³å¯ãªç価æ§ã¯é
åã®ã¤ã³ããã¯ã¹ãæ¢ãã¡ã½ããã§ä½¿ç¨ããã¾ããArray.prototype.indexOf()ãArray.prototype.lastIndexOf()ãTypedArray.prototype.indexOf()ãTypedArray.prototype.lastIndexOf()ãcase ã§ã®æ¯è¼ã§ããã¤ã¾ããindexOf(NaN) ã使ç¨ãã¦é
åã® NaN å¤ã®ã¤ã³ããã¯ã¹ãæ¢ããããNaN ã switch æã® case å¤ã¨ãã¦ä½¿ç¨ãã¦ä½ãã¨ä¸è´ããããã¨ã¯ã§ãã¾ããã
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ãè¿ãã - ãªãã©ã³ãã®ä¸æ¹ããªãã¸ã§ã¯ãã§ããã䏿¹ãããªããã£ãã§ããå ´åããªãã¸ã§ã¯ããããªããã£ãã«å¤æãã¾ãã
- ãã®æ®µéã§ã両æ¹ã®ãªãã©ã³ãã¯ããªããã£ãï¼æååãæ°å¤ãè«çå¤ãã·ã³ãã«ãé·æ´æ°ã®ããããï¼ã«å¤æããã¾ããæ®ãã®å¤æã¯ãã±ã¼ã¹ãã¤ã±ã¼ã¹ã§è¡ããã¾ãã
- 両æ¹ãåãåã§ããã°ãæé 1 ã使ç¨ãã¦æ¯è¼ãã¾ãã
- 䏿¹ã®ãªãã©ã³ããã·ã³ãã«ã§ããã䏿¹ãããã§ãªãå ´åã¯ã
falseãè¿ãã¾ãã - 䏿¹ã®ãªãã©ã³ããè«çåã§ããã䏿¹ãããã§ãªãå ´åã¯ãè«çå¤ããæ°å¤ã¸ã®å¤æãè¡ããã¾ãã
true㯠1 ã«å¤æãããfalse㯠0 ã«å¤æããã¾ãããããã 2 ã¤ã®ãªãã©ã³ããç·©ãç価æ§ã§æ¯è¼ãã¾ãã - æ°å¤ããæååã¸: æååããæ°å¤ã¸å¤æãã¾ãã夿ã«å¤±æããã¨
NaNã¨ãªããç価æ§ãfalseã¨ãªããã¨ãä¿è¨¼ããã¦ãã¾ãã - æ°å¤ããé·æ´æ°ã¸: æ°å¦çãªå¤ã§æ¯è¼ãã¾ããæ°å¤ã ±Infinity ã¾ãã¯
NaNã§ããã°ãfalseãè¿ãã¾ãã - æååããé·æ´æ°ã¸: æååã
BigInt()ã³ã³ã¹ãã©ã¯ã¿ã¼ã¨åãã¢ã«ã´ãªãºã ã使ç¨ãã¦é·æ´æ°ã¸ã¨å¤æãã¾ãã夿ã«å¤±æããå ´åã¯ãfalseãè¿ãã¾ãã
ä¼çµ±çã«ããã㦠ECMAScript ã«ããã°ããã¹ã¦ã®ããªããã£ãã¨ãªãã¸ã§ã¯ã㯠undefined ããã³ null ã¨ç·©ãä¸ç価ã§ããã¨ããã¦ãã¾ããããããã»ã¨ãã©ã®ãã©ã¦ã¶ã¼ã¯ãããã³ã³ããã¹ãã«ããã¦ãé常ã«çãã¯ã©ã¹ã®ãªãã¸ã§ã¯ãï¼å
·ä½çã«ã¯ããããããã¼ã¸ã® document.all ãªãã¸ã§ã¯ãï¼ãããããã undefined ã¨ããå¤ãæã¤ãã®ããã«æ¯ãèããã¨ã許å¯ãã¦ãã¾ããç·©ãç価æ§ã¯ãã®ãããªã³ã³ããã¹ãã® 1 ã¤ã§ããnull == A 㨠undefined == A ã¯ãA ã undefined ãã¨ãã¥ã¬ã¼ããããªãã¸ã§ã¯ãã§ããå ´åã«ã®ã¿çã¨è©ä¾¡ããã¾ããä»ã«ããªãã¸ã§ã¯ãã undefined ã null ã¨ç·©ãããªç価æ§ãæã¤ãã¨ã¯ããã¾ããã
ã»ã¨ãã©ã®å ´åãç·©ãç価æ§ã使ç¨ãããã¨ã¯æ¨å¥¨ããã¾ãããå³å¯ãªç価æ§ãç¨ããæ¯è¼ã®çµæã¯äºæ¸¬ãããããå夿ããªãããããããã°ããè©ä¾¡ã§ããå¯è½æ§ãããã¾ãã
次ã®ä¾ã¯ãæ°å¤ããªããã£ã 0ãé·æ´æ°ããªããã£ã 0nãæååããªããã£ã '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() ã使ç¨ããåå¤ç価æ§
åå¤ç価æ§ã¯ããã¹ã¦ã®ç¶æ³ã§ 2 ã¤ã®å¤ãæ©è½çã«åä¸ãã夿ãã¾ãï¼ãã®ç¨æ³ã¯ãªã¹ã³ãã®ç½®æååã®å®è·µä¾ã¨è¨ãã¾ãï¼ãä¾ã¨ãã¦ã夿´ä¸å¯ã®ããããã£ãå¤åããããã¨ããå ´åãè¦ã¦ã¿ã¾ãããã
// 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 ã¯çããã¨ã¿ãªãã¾ãã
åå¤ã¼ãçä¾¡æ§ (Same-value-zero equality) 㯠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" ã¨ãªãã¾ãããããã¯äºéçå·ãåºæ¬å½¢ã§ãããä¸éçå·ã¯ 2 ã¤ã®ãªãã©ã³ããåä¸ã®åã§ãããã¨ãè¦æ±ããã¨ããå¶ç´ãå ãã¦ãããã¨ãããä¸éçå·ãæ¡å¼µå½¢ã§ããã¨è¨ãããããããã¾ããã
ãããããã®èãæ¹ã¯ãç価æ§ã®æ¯è¼ã䏿¬¡å
ã®ãã¹ãã¯ãã«ããå½¢æãããå®å
¨ã«å³å¯ãªããã®ãä¸ç«¯ã«ããããå®å
¨ã«ç·©ãããã®ãä»ã«ããããã¨ãæå³ãã¾ãããã®ã¢ãã«ã¯Object.isã§ã¯ä¸ååã§ãäºéçå·ããããç·©ãããä¸éçå·ããããå³ããããã®ã§ã¯ãªãããã®ä¸éï¼ã¤ã¾ããäºéçå·ãããå³ãããä¸éçå·ãããç·©ãï¼ã«ãå½ã¦ã¯ã¾ããªãããã§ããå䏿§ãæ¯è¼ãã以ä¸ã®è¡¨ãããObject.is ã NaN ãæ±ãæ¹æ³ãåå ã§ãããã¨ããããã¾ããObject.is(NaN, NaN) ã false ã«è©ä¾¡ãããã®ã§ããã°ã-0 㨠+0 ãåºå¥ãããã¨ã«ãããä¸éçå·ããå³å¯ã§ãããã¨ããç·©ã/å³å¯ã®ã¹ãã¯ãã«ã«å«ãããã¨ãã§ãããã¨ã«æ³¨ç®ãã¦ãã ãããããã NaN ã®æ±ãã¯ããããæ£ãããªããã¨ã表ãã¾ããæ®å¿µãªãããObject.is ã¯ç価æ¼ç®åã«é¢ããç·©ããå³å¯ãã§ã¯ãªããåç´ã«åºæã®ç¹æ§ã®è¦³ç¹ããèããªããã°ãªãã¾ããã
| x | y | == |
=== |
Object.is |
åå¤ã¼ã |
|---|---|---|---|---|---|
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 ã§ã¯ãªã === ã使ç¨ãã¦ãã ããã2 ã¤ã® 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ãå¼ã«åãè¾¼ã¾ããå¯è½æ§ãããã¾ããä¾ãã°ãè² ã®å¤ã®ç´¯ä¹ã§-Infinityãçºçããããã«Math.powã使ç¨ããã¨ãã奿°ã®ææ°ã¯-0ã«è©ä¾¡ããã¾ããããããã®ã¡ã½ããã®ããã¥ã¡ã³ãã確èªãã¦ãã ããã Math.floor,Math.max,Math.min,Math.sin,Math.sqrt,Math.tan-
弿°ã®ã²ã¨ã¤ã
-0ã§ããå ´åã«ããããã®ã¡ã½ãããã-0ãè¿å¤ã¨ãã¦å¾ãå¯è½æ§ãããã¾ããä¾ãã°ãMath.min(-0, +0)ã¯-0ã«ãªãã¾ããããããã®ã¡ã½ããã®ããã¥ã¡ã³ãã確èªãã¦ãã ããã ~,<<,>>-
ãããã®æ¼ç®åã¯ãå é¨ã§ ToInt32 ã¢ã«ã´ãªãºã ã使ç¨ãã¾ããå é¨ã® 32 ãããæ´æ°å㯠0 ã®è¡¨ç¾ã 1 種é¡ãããªããããéã®æ¼ç®ãè¡ã£ãå¾ã«
-0ã¯æ»ããªãã§ããããä¾ãã°Object.is(~~(-0), -0)ãObject.is(-0 << 2 >> 2, -0)ã¯ãfalseã«ãªãã¾ãã
ã¼ãã®ç¬¦å·ãèæ
®ãã¦ããªãå ´åã«ãObject.is ã«é ¼ããã¨ã¯å±éºã§ãããããã¡ãã -0 㨠+0 ãåºå¥ããæå³ãããã°ãããã¯ã¾ãã«æããã¨ã§ãã
注æ: Object.is() 㨠NaN
Object.is ã®ä»æ§æ¸ã§ã¯ããã¹ã¦ã® 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]