正の 0 および負の 0。 JavaScript では、正のゼロと負のゼロが区別されます。
と、言いつつ +0 と -0 は区別されていないように見えますが、
+0 === -0; // true
内部では区別されていて 浮動小数点 の符号部をチェックすることで判別可能で、
function isNegativeZero(x) {
return x === 0 && new Uint8Array(new Float32Array([ x ]).buffer)[3] === 128;
}
function isPositiveZero(x) {
return x === 0 && new Uint8Array(new Float32Array([ x ]).buffer)[3] === 0;
}
isNegativeZero(+0); // false
isNegativeZero(-0); // true
isPositiveZero(+0); // true
isPositiveZero(-0); // false
テストで雑に deepEqual したときにエラーで弾かれる場合があります。
assert.deepEqual(new Float32Array([ +0 ]), new Float32Array([ -0 ]));
// ↑ テストに失敗する