2010-03-04 30 views
7

w JavaScript, jedną z reliable ways to convert a string to a number jest konstruktor Number:Jaka jest różnica między "nową liczbą (...)" a "liczbą (...)" w JavaScript?

var x = Number('09'); // 9, because it defaults to decimal 

Zainspirowany this question, zacząłem zastanawiać, — jaka jest różnica pomiędzy powyżej:

var x =new Number('09'); 

Number pewnością wygląda lepiej, ale wydaje się, że jest to niewłaściwe użycie konstruktora. Czy są jakieś efekty uboczne lub jakiekolwiek inne różnice w korzystaniu z niego bez nowego nowego? Jeśli nie ma różnicy, dlaczego nie, i jaki jest cel nowy?

Odpowiedz

10

W pierwszym przypadku, używasz Number Constructor Called as a Function, jak opisano w opisie, że będzie po prostu wykonać konwersję typu, wracając ci Number prymitywne.

W drugim przypadku, używasz Number Constructor dokonać Number obiekt:

var x = Number('09'); 
typeof x; // 'number' 

var x = new Number('09'); 
typeof x; // 'object' 

Number('1') === new Number('1'); // false 

Różnica może być subtelna, ale myślę, że ważne jest, aby zauważyć, jak wrapper obiektów ustawę o prymitywny wartości.

+1

Aby być uczciwym, 'nowa liczba ('1') === nowa cyfra (" 1 ")' jest również "fałszem", ale w inny sposób się z tobą zgadzam :) –

+1

Dobrze, ponieważ to spowoduje porównanie dwóch różnych obiektów referencje. – CMS

+0

@Richard Szalay - ale, 'Number ('1') === Number ('1')' is 'true', co ilustruje punkt @ CMS. – Nicole

0

SpiderMonkey-1.7.0:

js> typeof new Number('09'); 
object 
js> typeof Number('09'); 
number 
4

Number zwraca pierwotną wartość liczbową. Tak, to trochę dziwne, że możesz użyć funkcji konstruktora również jako zwykłej funkcji, ale tak właśnie zdefiniowano JavaScript. Większość typów wbudowanych języków ma dziwne i niespójne dodatkowe funkcje, takie jak te, które zostały wrzucone.

new Number konstruuje obiekt o wyraźnej obudowie Number. Różnica:

typeof Number(1)  // number 
typeof new Number(1) // object 

W przeciwieństwie do pudełkowych prymitywnych klas Javy w JavaScript wyraźnych Number obiektów są absolutnie bezużyteczna.

Nie zawracałbym sobie głowy użyciem żadnego z Number. Jeśli chcesz być jednoznaczny, użyj parseFloat('09'); jeśli chcesz być zwięzły, użyj +'09'; jeśli chcesz zezwolić tylko na liczby całkowite, użyj parseInt('09', 10).

+0

+1, żałuję, że nie mogę zaakceptować dwóch odpowiedzi jako poprawnych, ponieważ obie są w pełni poprawne i zawierają unikalne pomocne informacje. Nie wiedziałem o użyciu '+' bez poprzedzającej go liczby. – Nicole

0

Liczba (bez nowych) nie wydaje się dokładnie w prymitywie. W poniższym przykładzie wywoływana jest metoda anyMethod() w prototypie Number.

Number(3).anyMethod() 

Zważywszy

3.anyMethod() 

nie będzie działać.

Powiązane problemy