在JavaScript中打破NaN

是否有任何現代瀏覽器會引起NaN傳播異常(即,對NaN乘以或加一個數字),或者可以對其進行配置?

靜默的NaN傳播是錯誤的可怕且陰險的來源,我希望能夠及早發現它們,即使性能受到影響。


這是use strictjshint等的示例錯誤。 不會接:

object = new MyObject();
object.position.x = 0;
object.position.y = 10;
// ... lots of code
var newPosition = object.position + 1;           
          
asked 2020-02-29T12:21:31Z
5個解決方案
37 votes

要回答詢問的問題:

是否有任何現代瀏覽器會引起NaN傳播異常(即,對NaN乘以或加一個數字),或者可以對其進行配置?

否。JavaScript是一種非常寬容的語言,不需要在意是否要將Math.PI與“ potato”相乘(提示:這是NaN)。 它只是關于我們開發人員必須處理的語言的壞部分(或好部分,具體取決于您的觀點)之一。

解決您可能會問這個問題的錯誤(大概),在對象上使用getter和setter是實施此錯誤并避免出現此類錯誤的一種可靠方法。

answered 2020-02-29T12:38:36Z
26 votes

以下代碼可能會對您有所幫助。

為了完全解決此問題可以领救济金的游戏,我認為我們需要像valueOf這樣的東西。我們可以重新加載'+-/ *'之類的運算符,并檢查操作數是否為數字,如果不是,則拋出Error。

作為部分解決方案,當JavaScript執行類似“ a + b”的操作時,它將調用從Object.prototype繼承的valueOf方法,我們可以重寫Object.prototype.valueOf

Object.prototype.originalValueOf = Object.prototype.valueOf;
Object.prototype.valueOf = function() {
  if (typeof this !== 'number') {
    throw new Error('Object is not a Number');
  }
  return this.originalValueOf();
}
var a = 1 + 2;
answered 2020-02-29T12:39:10Z
10 votes

最簡單的方法是使用簡短的方便函數可以领救济金的游戏,每次都可驗證表達式的結果

我知道這不是您要尋找的答案,但這是javascript的性質,您不能傷心地更改它

function v(a){ if(isNaN(a)) throw "error"; return a; }
var test = v(100 * "abc");
answered 2020-02-29T12:39:35Z
2 votes

我認為在這種情況下可以领救济金的游戏,getter和setter會派上用場。

以下是一個偽代碼示例,僅供您參考。

//Inside your Object class code.
function getPosition() {
 
answered 2020-02-29T12:40:04Z
2 votes

我知道這是一個老話題,但是我認為您的問題可能有一個非常簡單的答案。 您可以為以下語句創建一個函數或將其內聯添加。

JavaScript對于某些值具有一些獨特的行為。 這些獨特的行為之一圍繞著非數字值xNaN的值將不等于包括NaN本身的任何其他值。 因此,以下語句:

if(x != x) {
    throw "Value is NaN!";
}

僅當x的值為NaN時,true才成立。

answered 2020-02-29T12:40:33Z
translate from