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ı , Numberbir işlev olarak adlandırılan yapıcı gerçekleştirir tür dönüşüm ve parseIntgerç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.
NumberYapı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 doSomethingolarak ç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 === 2yanlış 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ı Numberve parseInt. Hatta sayı argümanı için 0 döndüren "özellik" var. İşte performans testleri .
Numberve parseIntdiğerlerinden% 99 daha yavaş. Artı bana onlar da görsel olarak daha az çekici :-)
parseIntveya Numberdaha 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() >> 0taş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 stringetmek 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 undefinedveya 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.undefinedveya 0 ise, JS aşağıdakileri kabul eder:
ES5daha 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.
0bile 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.