2012-08-16 21 views

cevap

16

Hayır. Her ikisi de iç ToNumber(string) işlevinin çağrılmasına neden olur. ES5 section 15.7.1 itibaren

(Sayı Yapıcı Fonksiyonu Olarak Aranan):

Number bir fonksiyonu olarak yerine yapıcı olarak adlandırılır

, bir tür dönüşümü gerçekleştirir ...

Numara döndürür Değer sağlanmışsa ToNumber(value) olarak hesaplanan değer (Number nesnesi değil), +0 değerini döndürür.

() parseFloat (dize) ES5 section 15.1.2.3 Gönderen:

... ne trimmedString ne de trimmedString tatmin herhangi önek Eğer bir sözdizimi StrDecimalLiteral ...

(9.3.1 bakınız)

Ve 9.3.1 ilk alıntı söz ediyor nesöylediği zaman etmektir "Dize Türü ToNumber Uygulamalı" başlıklı bölümü vardır. new operatör ile Number yapıcı arayarak


Güncelleme (yorumlar)

, yerine sayısal hazır değil, Number nesnenin bir örneğini alacak. Bu section 15.7.2 de (No Oluşturucu) gibi tanımlanmıştır

typeof new Number(10); //object 
typeof Number(10); //number 

: Örneğin

Number bir yapıcı bir new ifadesi bir parçası olarak adlandırılır

: bu yeni oluşturulan nesne başlatır. sayısal bir değer olarak bir sargı bir nesne oluşturmak için new kullanmadiinizda

+0

Yani "Yeni Sayı (...)" yaparsam ne olur? Bu nasıl değişir? – Neal

+0

'typeof new Number (3) ===" object "', "typeof 3 ===" sayı "ve" typeeof Number (3) === "sayı" ' – jackwanders

+0

Bir Number nesnesini geri alırsınız katı olmayan karşılaştırmalarda 'valueOf' yöntemi çağrılır, ancak nesnelerle olmayan katı karşılaştırmalar başarısız olur. 'Number' nesneleri IMO ile uğraşmak için sadece kötü bir fikir (ve değer ne için, Crockford da onları sevmez) –

0

, Number sadece numaraya dizgeden türü dönüştürme yapmak için küme.Yalnızca çalışıyorsanız

'parseFloat' Öte yandan, sen de belirtildiği gibi, bir rakam, bir ondalık veya Yani +/-

ile başlayan herhangi bir dize gelen bir kayan nokta sayısı ayrıştırmak Yalnızca sayısal değerler içeren dizelerle, ve parseFloat(x) aynı değerlerle sonuçlanacaktır

2

Dizinizde rakamlardan başka bir şey olmadığından emin olmadığınız bir sürü farklılık değil. Varsa, Number, NaN'u döndürecektir.
Number yapıcısını kullanarak karşılaşabileceğiniz başka bir sorun, iş arkadaşlarınızın new anahtar sözcüğünü unuttuğunuzu ve daha sonra eklemek için new Number(123) === 123 -> false iken Number(123) === 123 -> true değerinin doğru olduğunu düşündüğünüzdür. +numString veya parse* kullanın: Genelde

, bir int/şamandıraya döküm Ne için Number yapıcı bırakın ve sadece orada en kısa sözdizimi kullanmayı tercih ediyorum.

18

@James Allardic halihazırda cevaplandırıldığı gibi, iç işleyiş farklı değildir. Yine de bir fark var. parseFloat kullanarak, bir veya daha fazla sayısal karakterle başlayan bir (kesilmiş) dize ve ardından alfasayısal karakterler, Number ile bir Sayıya dönüştürebilir, bu da başarılı olmaz. olduğu gibi: her iki dönüşüm de

parseFloat('3.23abc'); //=> 3.23 
Number('3.23abc'); //=> NaN 

, girdi dizesi arada, trimlenirse:

parseFloat(' 3.23abc '); //=> 3.23 
Number(' 3.23 '); //=> 3.23 
+0

+1, bu doğru, ama soruda tanımlanan durumlarda, hiçbir fark yoktur - "gerçek bir sayı dizesini geçtiğinizde". Bunu zaten doğru anladığımı varsayarsak. –

+0

Başka bir fark, "" "ve" "" nin sonucudur, her iki durumda da Number '0' verir ancak parseFloat, "NaN" değerini verir. –

+0

Bunu biliyorum. Hatta OP'de ...Bu ** sormadı ne ** .... – Neal

-1

henüz başka Yanıt göndererek Affedersiniz, ama sadece bir Google araması ile burada var ve yaptığımız İstediğim tüm detayları bulamıyorum. Node.js aşağıdaki kodu çalıştırma:

val=1, Number()=1, parseFloat()=1, if()=true 
val=1.1, Number()=1.1, parseFloat()=1.1, if()=true 
val=0, Number()=0, parseFloat()=0, if()=true 
val=1.1abc, Number()=NaN, parseFloat()=1.1, if()=true 
val=, Number()=0, parseFloat()=NaN, if()=false 
val= , Number()=0, parseFloat()=NaN, if()=true 
val=null, Number()=0, parseFloat()=NaN, if()=false 

Bazı önemli çıkarımlar::

var vals = ["1", "1.1", "0", "1.1abc", "", " ", null]; 
for(var i = 0; i < vals.length; i++){ 
    var ifTest = false; 
    if(vals[i]) 
    { 
    ifTest = true; 
    } 
    console.log("val=" + vals[i] + ", Number()=" + Number(vals[i])+ ", parseFloat()=" + parseFloat(vals[i]) + ", if()=" + ifTest); 
} 

şu çıktıyı verir

  1. Eğer dönüştürmek denemeden önce bir if (val) ile koruma numaraya, ardından parseFloat(), boşluk karakteri dışında bir sayı döndürecektir.
  2. Sayı, beyaz boşluk dışında sayısal olmayan karakterler dışında tüm durumlarda bir sayı döndürür.

Eksik olduğum test örneklerini eklemek için lütfen çekinmeyin.