[英]Differentiating +0 and -0
盡管+0
和-0
是不同的實體,但+0 === -0
計算結果為true
。 那么,你如何區分+0
和-0
呢?
有一個黑客:
if (1 / myZero > 0) {
// myZero is +0
} else {
// myZero is -0
}
我能做得更好嗎?
在 ECMAScript 6 中, Object.is
行為類似於===
只是它區分正零和負零,並且Object.is(NaN, NaN)
計算結果為true
。 (請參閱此處的文章。)
Chrome 24 支持Object.is
。
這仍然是某種黑客行為,但查看規范表明了這一點:
Math.atan2(0, -0) === Math.PI // true
Math.atan2(0, 0) === 0 // true
根據大衛弗拉納根的書,p。 34 ,將 1 除以零將產生相應的無窮大,然后可以在等式檢查中使用它:
1 / 0
> Infinity
1 / -0
> -Infinity
這是無窮大的相等比較的行為:
Infinity === -Infinity
> false
Infinity === Infinity
> true
-Infinity === Infinity
> false
-Infinity === -Infinity
> true
這將返回 +0:
-0 + 0
這無助於區分 -0 和 +0,但這有助於確保某些值不是 -0。
1 / -0 => -Infinity
1 / (-0 + 0) => Infinity
正如人們似乎難以理解這樣做的實際需求是什么:這是我的用例......
我需要一個解決方案來按索引對表的列進行排序。 單擊<th>
並使用 [ordinal] 升序和 -[ordinal] 降序調用排序器。 第一列將給出-0
表示降序或0
表示升序。
所以我需要區分+0
和-0
並在這里結束。 對我有用的解決方案在@Šime Vidas 的評論中,但有些隱藏。
[已刪除部分 - 請參閱下面的評論]
要檢查負零,這里有一個簡單的解決方案。
function isNegativeZero(n) {
n = Number( n );
return (n === 0) && (1 / n === -Infinity);
}
正如馬特芬威克所暗示的那樣,你可以這樣做(使用 var zero
):
if(1/zero===Infinity) {
// zero is +0
} else {
// zero is -0
}
使用Math.sign()
Math.sign( 1 / +0 )
Math.sign( 1 / -0 )
Math.sign( 1 / x )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.