Dizeleri sayılara dönüştürürken nasıl farklı davranır parseInt()
ve Number()
davranırsınız?
Dizeleri sayılara dönüştürürken nasıl farklı davranır parseInt()
ve Number()
davranırsınız?
Yanıtlar:
De, bunlar semantik farklı , Number
bir işlev olarak adlandırılan yapıcı gerçekleştirir tür dönüşüm ve parseInt
gerçekleştirir ayrıştırma , örneğin:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
Dizede parseInt
önde gelen bir sıfır tespit ederse, sekizlik tabandaki sayıyı ayrıştıracağını, standardın yeni sürümü olan ECMAScript 5'te değiştiğini, ancak tarayıcı uygulamalarına girmenin uzun zaman alacağını unutmayın. ECMAScript 3) ile uyumsuzluk,parseInt
şu anda kullanılan tabanın herhangi bir basamağına karşılık gelmeyen izleyen karakterleri yok sayar.
Number
Yapıcı octals algılamaz:
Number("010"); // 10
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
Ancak, onaltılık gösterimdeki sayıları işleyebilir, tıpkı aşağıdaki gibi parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
Ek olarak, Sayısal tipte dönüşüm gerçekleştirmek için yaygın olarak kullanılan bir yapı, Unary +
Operator'dur (s. 72) , yapıcıyıNumber
işlev olarak kullanmaya eşdeğerdir :
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
hex ve ikili gibi çok sekizli ile uğraşır:Number('0o10') == 8
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
ilk ikisi bir nesne yerine bir ilkel döndürdüğünden size daha iyi performans verecektir.
new Number()
farklıdır Number()
. typeof Number("123") => number
new Number("1") != new Number("1")
. ASLA KULLANMAYINnew Number
. Asla asla asla asla. Number("1")
, diğer taraftan, son derece makul.
let x = new Number("2"); let y = new Number("2");
ve daha sonra if (x == y) { doSomething(); }
mantıksal doSomething
olarak çağrılmak için hangi nedenle olursa olsun bir eşitlik kontrolü yapıyorum . Ama olmayacak. Yalnızca bir numara ayrıştırmak olsaydı da let x = new Number("2");
o zaman x === 2
yanlış olur. Bu kullanmamanız için açık bir nedennew Number
Performans arıyorsanız muhtemelen en iyi sonuçlar bitsel sağa kaydırma ile elde edersiniz "10">>0
. Ayrıca çarpın ( "10" * 1
) veya değil ( ~~"10"
). Hepsi çok daha hızlı Number
ve parseInt
. Hatta sayı argümanı için 0 döndüren "özellik" var. İşte performans testleri .
Number
ve parseInt
diğerlerinden% 99 daha yavaş. Artı bana onlar da görsel olarak daha az çekici :-)
parseInt
veya Number
daha fazla tercih edilir. Saniyede milyonlarca dönüşüm içeren bir N64 öykünücüsü programlıyorsanız, bu hileleri düşünebilirsiniz.
(2**31).toString() >> 0
taşacak -2147483648
. JavaScript'in işleneni işaretsiz bir 32 bit tamsayı olarak işlemesi >>>
yerine kullanabilirsiniz , ancak daha büyük olan tüm sayılar da taşacaktır. >>
2**32 - 1
Ben performansın iki bağlantılar dönüştürme çeşitli şekillerde arasında karşılaştırma bulundu string
etmek int
.
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
Küçük bir fark, dönüştürdükleri şeydir undefined
veya null
,
Number() Or Number(null) // returns 0
süre
parseInt() Or parseInt(null) // returns NaN
parseInt()
:
NaN
.parseInt()
işlev olmayan bir sayısal değer karşılaştığında, bu giriş dizesi geri kalanını kesti ve sadece sigara sayısal değer kadar parçayı ayrıştırmak olacaktır.undefined
veya 0 ise, JS aşağıdakileri kabul eder:
ES5
daha sonra 10 kullanılması gerektiğini belirtir. Ancak, bu tüm tarayıcılar tarafından desteklenmez, bu nedenle sayılarınız 0 ile başlayabilirse her zaman sayı tabanı belirtin.Number()
:
Number()
Yapıcı bir sayıya Herhangi bir bağımsız değişken girişini dönüştürebilirsiniz. Eğer Number()
yapıcı bir sayıya giriş dönüştürmek olamaz,NaN
iade edilecektir.Number()
Yapıcı da onaltılık sayıyı işleyebilir, onlar ile başlamak zorunda 0x
.console.log(parseInt('0xF', 16)); // 15
// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));
// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10)); // 10
// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));
console.log('\n');
// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));
// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));
// scientific notation is allowed
console.log(Number('152e-1')); // 15.21
Her zaman parseInt kullanıyorum, ancak sekizli moda zorlayan sıfırlardan kaçının .
parseInt(value, radix)
kazara sekizli mod dönüşümleri, vb.
0
bile olmayan katı modda. Ama bu düzeltildi ve şimdi önde gelen sıfırlar göz ardı edildi, böylece parseInt("070")
olur 70
.
parseInt()
.
parseInt()
-> Bir sayıyı belirtilen tekrar aramaya ayrıştırır.
Number()
-> Belirtilen değeri sayısal eşdeğerine veya başarısız olursa NaN'ye dönüştürür.
Bu nedenle, sayısal olmayan bazı değerleri sayıya dönüştürmek için her zaman Number () işlevini kullanmalıyız.
Örneğin.
Number("")//0
parseInt("")//NaN
Number("123")//123
parseInt("123")//123
Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string
Number(true)//1
parseInt(true) //NaN
parseInt()
Yeniden çevirme dönüşümü yaptığı gibi işlevler için çeşitli köşe durumları vardır , bu nedenle parseInt () işlevini baskı amaçları için kullanmaktan kaçınmalıyız.
Şimdi, verilen değerin hava durumunu kontrol etmek için Sayısal olup olmadığını, yerel isNaN()
işlevi kullanmalıyız
parseInt bir tamsayıya dönüştürülür, yani ondalık sayılar çıkarır. Sayı tamsayıya dönüştürülmez.
ParseInt'ten uzak durmak ve hex veya octal'a ihtiyacınız yoksa Number ve Math.round kullanmak iyi bir fikirdir. Her ikisi de dize kullanabilir. Neden ondan uzak dursun?
parseInt(0.001, 10)
0
parseInt(-0.0000000001, 10)
-1
parseInt(0.0000000001, 10)
1
parseInt(4000000000000000000000, 10)
4
Tamamen büyük veya gerçekten küçük sayılar kasaplar. Garip bir şekilde bu girişler bir dize ise normal çalışır.
parseInt("-0.0000000001", 10)
0
parseInt("0.0000000001", 10)
0
parseInt("4000000000000000000000", 10)
4e+21
Bu ve bahsedilen diğer gotchas ile hata bulmak zor risk yerine, taban 10 dışında bir şey ayrıştırmak gerekmedikçe parseInt önlemek istiyorum. Number, Math.round, Math.foor ve .toFixed (0) Aynı şeyleri yapın parseInt bu tür hatalara sahip olmadan kullanılabilir.
Gerçekten diğer özelliklerinden bazıları için parseInt kullanmak istiyorsanız veya kullanmanız gerekiyorsa, şamandıraları ints'e dönüştürmek için asla kullanmayın.