Kullanıcı tercihlerine bağlı olarak Infinity'yi gösteren (yalnızca IE altında) bir dizi Javascript hesaplamam var.
Infinity
Örneğin, kelimenin görünmesi nasıl durdurulur ve 0.0
bunun yerine gösterilir?
Yanıtlar:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
isFinite
Nasıl tedavi etmek istediğinize bağlı olarak, muhtemelen bunun yerine işlevi kullanabilirsiniz NaN
. numaranız , veya ise isFinite
döndürür .false
POSITIVE_INFINITY
NEGATIVE_INFINITY
NaN
if (isFinite(result))
{
// ...
}
Infinity
özellik salt okunur değildir, bu da yeniden tanımlanabileceği anlamına gelir: Örneğin, "true"var x = 42; Infinity = 42; alert(x === Infinity);
görüntüler . (Kuşkusuz bilinmeyen bir durum olduğunu ve karar herkes yeniden tanımlama , vb garip şeyler olmaya beklemelidir.)Infinity
NaN
Number.(POSITIVE|NEGATIVE)_INFINITY
ya salt okunur değil, Infinity
olduğu salt okunur Katı modda. Ayrıca, -?1/0
size sunduğum dava ne olacak? Her neyse, isFinite
bunun yerine neredeyse her zaman kullanmalısınız .
Number.POSITIVE_INFINITY
ve Number.NEGATIVE_INFINITY
edilir salt okunur (Chrome8, FF3.6 ve IE8 üzerinde test). Kullanmak iyi 1/0
çalışır, ancak kodunuzun bakımcıları için aslında neyi test etmeye çalıştığınız o kadar açık olmayacaktır. Kullanmanın isFinite
neredeyse her zaman bir şeyler yapmanın daha iyi bir yolu olduğuna katılıyorum - bu yüzden cevabımda bundan bahsetmiştim - ancak gereksinimlerini karşılayıp karşılamadığına sadece OP karar verebilir.
Object.defineProperty
ve ile yeniden tanımlayabilirsiniz __defineGetter__
. Infinity
Öte yandan, bir katı modda olmayan yapılandırılabilir.
Basit n === n+1
veya n === n/0
çalışır:
function isInfinite(n) {
return n === n/0;
}
Bu yerli unutmayın isFinite()
numaralara coerces girdiler. isFinite([])
ve isFinite(null)
her ikisi true
de örneğin.
n === n+1
2 ^ 53'ten büyük tüm sayılar, yani 1e30 için doğru olarak değerlendirilir. Bölme kesmek, NaN ve -Infinity için bile çalışır. Bununla birlikte, LukeH'nin cevabı size waaaay'e daha okunaklı bir kod verir.
n+1
temsil edilemez ve yuvarlamaya tabidir. Tam sayılar bile yuvarlama hatalarından etkilenir. Btw, kodunuzun "matematik kanıtı" olduğunu sanmıyorum, sadece deneyin n === n/-0
. Gerçekleri +/- inf ile tamamlarken, altta yatan sıfır sekansının pozitif olduğu varsayılmadıkça limitiniz iyi tanımlanmamıştır.
In ES6
, Number.isFinite()
Yöntem, aktarılan değerin sonlu bir sayı olup olmadığını belirler.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Lodash'ı okunabilirliğin yanı sıra çeşitli savunma kodlama nedenleri için kullanmayı seviyorum . ES6 Number.isFinite
harika ve sayısal olmayan değerlerle ilgili sorunları yok, ancak ES6 mümkün değilse, zaten lodash'ınız var veya daha kısa kod istiyorsunuz: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Değerin NaN
veya Infinity
türünde olup olmadığını kontrol etmemi, ancak dizeleri geçerli sonuçlar olarak iletmemi gerektiren bir senaryoyla karşılaştım . Birçok metin dizesi yanlış pozitif üreteceğinden NaN
, bunu aşmak için basit bir çözüm buldum:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Yukarıdaki kod, değerleri dizelere dönüştürür ve bunların kesinlikle NaN veya Infinity'ye eşit olup olmadıklarını kontrol eder (negatif sonsuzluk için başka bir durum eklemeniz gerekir).
Yani:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
toString()
yerine kullanırsam seni daha mutlu eder miydi? Bunun nasıl tutarsız sonuçlara yol açabileceğine veya tam olarak bu yöntemin neden önerilmediğine dair olumsuz oy vermekten veya bunun nedenlerini belirtmekten çekinmeyin. Şimdiye kadar, hala bir cevap arayanlar için bir seçenek eklediğini hissediyorum ve bunun tehlikeli, istikrarsız vb.
İsFinite'ı pencerede kullanabilirsiniz ,isFinite(123)
:
Şöyle bir fonksiyon yazabilirsiniz:
function isInfinite(num) {
return !isFinite(num);
}
Ve şu şekilde kullanın:
isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true
Ayrıca Number.isFinit
değerin de Sayı olup olmadığını ve kontrol için daha doğru olup olmadığını kontrol edebilir undefined
venull
vb ...
Veya şu şekilde çoklu doldurabilirsiniz :
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
yerine-?Infinity
ya da kullanmalı-?1/0
?