Hangisi daha iyi, sayı (x) veya parseFloat (x)?


147

Hangisi daha iyi?

Bunu sadece birkaç bayt tıraş etmek için soruyorum, çünkü (x) yerine + x kullanabilirim. Parsefloat daha iyi bir şey yapar mı?


2
Tek duyarlıklı kayar nokta sayıları 32 bit sistemde 4 bayt ve düz tamsayılar kaplar. Javascript'in nasıl yüzdüğünü bilmiyorum ama sanırım hemen hemen aynı.
Christian

5
@Christian: Javascript'teki tüm sayılar çift duyarlıklı kayan reklamlardır.
Guffa

1
EDIT segmenti olmasaydı bu soruya YUKARI oy verdim
LaPuyaLoca

Yanıtlar:


310

ParseFloat ve Number arasındaki fark

parseFloat/ parseInt, bir dizeyi ayrıştırmak için kullanılırken Number/ +, bir değeri bir sayıya zorlamak içindir. Farklı davranıyorlar. Ama önce aynı şekilde nerede davrandıklarına bakalım:

parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000

Standart sayısal girdiniz olduğu sürece hiçbir fark yoktur. Ancak, girdiniz bir sayı ile başlar ve sonra başka karakterler içeriyorsa parseFloat, dizeden sayıyı keser, Numberverir NaN(sayı değil):

parseFloat('1x'); // => 1
Number('1x'); // => NaN

Ayrıca, Numberonaltılık girişi anlar parseFloat, ancak şunları yapmaz:

parseFloat('0x10'); // => 0
Number('0x10'); // => 16

Ancak Numberboş dizelerle veya yalnızca beyaz boşluk içeren dizelerle garip davranır:

parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0

Genel olarak, Numberdaha makul buluyorum , bu yüzden neredeyse her zaman Numberkişisel olarak kullanıyorum (ve dahili JavaScript işlevlerinin çoğunun Numberda kullandığını göreceksiniz ). Eğer birisi yazıyorsa '1x', sanki yazmış gibi davranmak yerine bir hata göstermeyi tercih ederim '1'. Gerçekten bir istisna yaptığım tek zaman, bir stili bir sayıya dönüştürdüğüm zamandır, bu durumda parseFloatyardımcı olur, çünkü stiller bir formda gelir '3px', bu durumda 'px'parçayı bırakmak ve sadece almak istiyorum 3, bu yüzden parseFloatyararlı buluyorum buraya. Ama gerçekten hangisini seçtiğiniz size ve hangi girdi biçimlerini kabul etmek istediğinize bağlı.

Tekli +işleci kullanmanın Number, işlev olarak kullanmakla tamamen aynı olduğunu unutmayın :

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40

Bu yüzden genellikle sadece +kısa süreli kullanıyorum. Ne yaptığını bildiğiniz sürece okumayı kolay buluyorum.


2
Ben whitespace => 0 davranışı Number()"garip" olarak kabul etmem Hatta daha beklendiği gibi düşünürdüm, boşluk boş bir değerdir ama null / undefined => 0 güzel bir sonuç değil. Yine de vitrinler için büyük (+) :)
jave.web

4
@NathanWall: değinmek istiyorum Olabilir o Number('Infinity') === InfinityoysaparseInt('Infinity') === NaN
sstur

3
Ben kullanmak ister +önceki satırda noktalı virgül unutursanız, çünkü bunun için (tekli artı), ilave bir ifadesi yerine değerlendirilebilir.
Jackson

1
Aynı davranışlar için parseFloat% 1 ila% 15 daha yavaş olduğunu öğrendim, bir dize ondalık basamak sayısı arttığında yavaşlar. Sistemimde 1M çalıştırıldığında parseFloat ('1.501'), Number'dan ('1.501')% 5 daha yavaş ve parseFloat ('1.50137585467'), Number'dan ('1.50137585467')% 15 daha yavaş. Yani, Number () için gidiyorum.
bytepan

1
@ ChrisBrownie55 Vay canına, iyi yakaladın. ParseFloat'ın bunu yapabileceğini bilmiyordum. Sanırım Infinity tamsayı değil!
sstur

9

Fark, girdi bir "uygun sayı" olmadığında olan şeydir. Numberdöner NaNiken parseFloatayrıştırır "elinden olduğu kadar". Boş bir dize çağrıda ise Numbergetiri 0parseFloat döner iken NaN.

Örneğin:

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32

4
Not o NaN != NaNolsa
Wex

@Wex Oh TRUE olarakNaN != NaN değerlendirdiğinizden bahsediyorsunuz - bahşiş için teşekkürler!
jave.web

4
NaN değerini test etmek için isNaN () kullanın , isNaN(NaN)döndürürtrue
jave.web

5

Bu örneklerde farkı görebilirsiniz:

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;

parseFloat, bir dizedeki bir sayının ilk görünümünü ararken biraz yavaştır, ancak Number constuctor, boşluk içeren sayısal değerler içeren veya yanlış değerler içeren dizelerden yeni bir sayı örneği oluşturur.

Not: Bazı evrensel tip dönüşüm çözümleriyle ilgileniyorsanız blogumdaki tür dönüşümü hakkındaki yazıyı okuyabilirsiniz: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html


2

Boş dize için farklıdırlar.

+""ve Number("")0, parseFloat("")NaN değerini döndürür.


2
Ben parseFloat()boş bir dize olarak doğru sonucu var söylemek için gitmek istiyorum sayı 0(okuma: NaN) DEĞİL karakteri ile bir dize "0"IS olduğunu 0;
Christopher

+xdöndüren 0boş bir dize için değil, aynı zamanda herhangi bir boşluk yalnızca dizeleri sadece. Örnekler: +" ", +"\t\t\t", +"\n\n"- hepsi vermek 0sonucu
Lukasz WIKTOR

2

Bildiğim kadarıyla ve bu sadece meslektaşlarından duyulmuyor, bu yüzden tamamen hasta bilgilendirilebilir, parseFloat marjinal olarak daha hızlıdır.

Daha fazla araştırma yapılmasına rağmen, bu performans farkının tarayıcıya bağlı olduğu görülüyor.

http://jsperf.com/parseint-vs-parsefloat/6

Bu jsPerf sonuçlarına bir göz atın ve sizi arayın. (+ x testlerini de içerir)

S' @xdazz belirtildiği gibi cevap +""ve Number("")dönüş 0sırasında parseFloat("")döner NaNboş bir dize numarası 0 anlamına gelmez çünkü böylece Yine, parseFloat ile gider, karakteri ile sadece bir dize "0"Durum 0 anlamına içinde;


İşte daha hızlı bir şekilde dönüştürmek için daha kapsamlı bir test balıkçılığı ... parseFloat()hala kazanıyor.
mindplay.dk
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.