常見(jiàn)的場(chǎng)景
javascript中的 0 值判斷有許多坑制妄,比如當(dāng)你判斷一個(gè)對(duì)象中某個(gè)key是否有值掸绞,你可能會(huì)這樣寫(xiě):
if(obj[key]) {
// do sth.
}
但如果這個(gè)key所對(duì)應(yīng)的值是 0耕捞,那么你就被坑了烫幕,因?yàn)樵?if 判斷中,0 相當(dāng)于 false敞映,因此大括號(hào)中的語(yǔ)句并不會(huì)如預(yù)想那樣執(zhí)行较曼。
新的場(chǎng)景
而相似的振愿,我在開(kāi)發(fā)過(guò)程中遇到這樣一個(gè)場(chǎng)景捷犹,一個(gè)數(shù)組中的元素是大于等于 0 的數(shù)字埃疫,在某種情況下會(huì)讓元素的值乘以 -1,然后判斷元素為負(fù)時(shí)栓霜,進(jìn)行一系列操作翠桦,如下:
let v = arr[n] * -1;
if(v < 0) {
// do sth.
}
新坑出現(xiàn)了!
此時(shí)销凑,新的坑出現(xiàn)了,當(dāng)元素值為 0 時(shí)仅炊,-0 < 0 的結(jié)果為 false斗幼,所以語(yǔ)句并不會(huì)如預(yù)期一樣執(zhí)行:
let v = arr[n] * -1; // 若此時(shí) v === -0
if(v < 0) { // 判斷結(jié)果為 false
// do sth.
}
所以抚垄,當(dāng)判斷語(yǔ)句中涉及到 0 值時(shí)蜕窿,一定要慎重呆馁。
解決方案
那么如何判斷一個(gè)數(shù)字的值為 -0 還是 +0 呢?
首先浙滤,0 就是 +0阴挣。
判斷的方案有如下兩種:
- 商值法
function isNegativeZero(num) {
return num === 0 && (1 / num < 0); // 1與+0的商為Infinite,1與-0的商為-Infinite
}
- 對(duì)象鍵值比較法
function isNegativeZero(num) {
if (num !== 0) return false;
var obj = {};
Object.defineProperty(obj, 'num', { value: -0, configurable: false }); // 將對(duì)象設(shè)置為畔咧,不可配置
try {
Object.defineProperty(obj, 'num', { value: num }); // 因?yàn)閷?duì)象是不可配置的,所以若改變了對(duì)象num鍵對(duì)應(yīng)的value揖膜,就會(huì)報(bào)錯(cuò)誓沸。利用這種特性壹粟,來(lái)判斷參數(shù)num是否為-0
} catch (e) {
return false
};
return true;
}