ParseInt () ve Number () arasındaki fark nedir?


Yanıtlar:


457

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

İlginç, parseInt, sayıyı izleyen karakterleri yok sayar mı? Çünkü benim durumumda dönüştürürken 20 yerine bir NaN almayı tercih ederim.
Mark

Evet öyle. Kesinlikle istediğiniz gibi geliyor Number ()
Gareth

Tamam, sanırım Number () ile gideceğim ama bu noktayı ve tüm bu örnekleri temizlediğiniz için çok teşekkürler! :-)
Mark

1
Bunun için teşekkür ederim. NaN'i ilk kez gördüm. Bazı kişilerin NaN'nin isNaN (değer) işleviyle test edildiğini bilmesi yararlı olabilir. Örneğin, yalnızca "if (value == NaN)" kullanmak işe yaramaz.
WonderfulDay

1
Number()hex ve ikili gibi çok sekizli ile uğraşır:Number('0o10') == 8
Juan Mendes

22
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.


20
new Number()farklıdır Number(). typeof Number("123") => number
Gareth

8
Ayrıca new Number("1") != new Number("1"). ASLA KULLANMAYINnew Number . Asla asla asla asla. Number("1"), diğer taraftan, son derece makul.
Kragen Javier Sitaker

18
@Kragen, NEDEN "yeni Sayı" yı kullanmamanız gerektiğini açıklarsanız topluluğa çok daha faydalı olur - sadece "asla" 5 kez yazmak yerine ...
ken

1
@ken Çok eski yorum ama gelecekteki ziyaretçiler için bunun tam olarak başlamak için söz nedeni çünkü hayal. İki sayıyı ayrıştırıyorum 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
Tom C

1
@TomC Düzenlenmiş bir yorumun sonucunu görüyorsunuz (yorumu izleyen kurşun kalem simgesi budur); daha önce sıfır açıklama vardı, sadece güçlü öğütler vardı.
ken

15

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 .


1
Çeşitli yaklaşımların hızı, tarayıcı revizyonları ile zaman içinde değişmektedir. Bağlantılı test de değişti ve bu yorumun en son sürümü burada - jsperf.com/number-vs-parseint-vs-plus/39 - Neyse ki site testin önceki sürümlerini de içeriyor
bobo

@bobo, tabi. Merakı krom ile kontrol edildi - Numberve parseIntdiğerlerinden% 99 daha yavaş. Artı bana onlar da görsel olarak daha az çekici :-)
Saulius

15
Daima "yararsız" optimizasyonlara göre kod netliğini tercih edin. Çoğu kullanım durumunda 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.
ngryman

1
Soru davranışla ilgilidir, performans tartışması konu dışıdır.
pnömatik

1
Bunun büyük tamsayılarda (özellikle işaretli bir 32 bit tamsayıya sığmayan tamsayılarda) kullanılamayacağını unutmayın, çünkü JavaScript'te, bitsel operatörler işlenenlerini ondalık yerine 32 bitlik bir dizi olarak ele alır, onaltılık veya sekizli sayılar. Böylece (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
hasc


6

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

6

Özet:

parseInt():

  • Bir dizgeyi birinci argüman olarak alır, ikinci bağımsız değişken olarak sayı tabanı (örneğin ondalık 10 veya ikili 2 gibi bir sayısal sistemin temelini oluşturan bir tam sayı)
  • İlk karakter bir sayıya dönüştürülemezse işlev bir tamsayı döndürür NaN.
  • Eğer 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.
  • Sayı tabanı undefinedveya 0 ise, JS aşağıdakileri kabul eder:
    • Giriş dizesi "0x" veya "0X" ile başlıyorsa, yarıçap 16'dır (onaltılık), dizenin geri kalanı bir sayıya ayrıştırılır.
    • Giriş değeri 0 ile başlarsa, yarıçap 8 (sekizli) veya 10 (ondalık) olabilir. Hangi yarıçapın seçildiği JS motor uygulamasına bağlıdır. 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.
    • Giriş değeri herhangi bir sayı ile başlarsa, sayı tabanı 10 olur

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.

Misal:

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


5

Her zaman parseInt kullanıyorum, ancak sekizli moda zorlayan sıfırlardan kaçının .


35
Bence parseInt(value, radix)kazara sekizli mod dönüşümleri, vb.
Yok

Öncü sıfır olacak bunu ayrıştırmak olacak ECMAScript'e 3. ECMAScript 5'de sekizlik moduna zorlar 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.
Piotrek Hryciuk

2
Ayrıca, içine bir taban değeri sağlamanız için sizi uyaran bir linter de kullanmalısınız parseInt().
Justin

2

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


1

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.


1

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.