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ı?
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ı?
Yanıtlar:
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, Number
verir NaN
(sayı değil):
parseFloat('1x'); // => 1
Number('1x'); // => NaN
Ayrıca, Number
onaltılık girişi anlar parseFloat
, ancak şunları yapmaz:
parseFloat('0x10'); // => 0
Number('0x10'); // => 16
Ancak Number
boş 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, Number
daha makul buluyorum , bu yüzden neredeyse her zaman Number
kişisel olarak kullanıyorum (ve dahili JavaScript işlevlerinin çoğunun Number
da 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 parseFloat
yardımcı olur, çünkü stiller bir formda gelir '3px'
, bu durumda 'px'
parçayı bırakmak ve sadece almak istiyorum 3
, bu yüzden parseFloat
yararlı 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.
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 (+) :)
Number('Infinity') === Infinity
oysaparseInt('Infinity') === NaN
+
önceki satırda noktalı virgül unutursanız, çünkü bunun için (tekli artı), ilave bir ifadesi yerine değerlendirilebilir.
Fark, girdi bir "uygun sayı" olmadığında olan şeydir. Number
döner NaN
iken parseFloat
ayrıştırır "elinden olduğu kadar". Boş bir dize çağrıda ise Number
getiri 0
parseFloat döner iken NaN
.
Örneğin:
Number("") === 0 // also holds for false
isNaN(parseFloat("")) === true // and null
isNaN(Number("32f")) === true
parseFloat("32f") === 32
NaN != NaN
olsa
NaN != NaN
değerlendirdiğinizden bahsediyorsunuz - bahşiş için teşekkürler!
isNaN(NaN)
döndürürtrue
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
Boş dize için farklıdırlar.
+""
ve Number("")
0, parseFloat("")
NaN değerini döndürür.
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
;
+x
döndüren 0
boş bir dize için değil, aynı zamanda herhangi bir boşluk yalnızca dizeleri sadece. Örnekler: +" "
, +"\t\t\t"
, +"\n\n"
- hepsi vermek 0
sonucu
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üş 0
sırasında parseFloat("")
döner NaN
boş 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;
parseFloat()
hala kazanıyor.