2010-03-04 17 views
7

Trong javascript, một trong những reliable ways to convert a string to a numberNumber constructor:Sự khác biệt giữa "Số mới (...)" và "Số (...)" trong JavaScript là gì?

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

Lấy cảm hứng từ this question, tôi bắt đầu tự hỏi — phần chênh lệch giữa trên và là những gì:

var x =new Number('09'); 

Number chắc chắn sẽ tốt hơn, nhưng có vẻ như việc sử dụng một hàm tạo không phù hợp. Có bất kỳ tác dụng phụ hoặc bất kỳ sự khác biệt nào khi sử dụng nó mà không cần mới? Nếu không có sự khác biệt, tại sao không, và mục đích của là gì mới?

Trả lời

10

Trong trường hợp đầu tiên, bạn đang sử dụng Number Constructor Called as a Function, như mô tả trong cầu kỹ thuật, mà chỉ đơn giản sẽ thực hiện chuyển đổi loại hình, trở về quý khách Number nguyên thủy.

Trong trường hợp thứ hai, bạn đang sử dụng Number Constructor để thực hiện một Number đối tượng:

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

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

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

Sự khác biệt có thể tinh tế, nhưng tôi nghĩ điều quan trọng là bạn phải chú ý cách wrapper đối tượng hành động dựa trên nguyên thủy giá trị.

+1

Để công bằng, 'Số mới (' 1 ') === số mới (' 1 ') 'cũng là' sai', nhưng tôi đồng ý với bạn :) –

+1

Đúng, vì điều đó sẽ so sánh hai đối tượng khác nhau tài liệu tham khảo. – CMS

+0

@Richard Szalay - nhưng, 'Số ('1') === Số ('1')' là 'đúng', minh họa điểm của CMS. – Nicole

0

SpiderMonkey-1.7.0:

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

Number trả về giá trị số nguyên thủy. Vâng, có một chút kỳ quặc là bạn có thể sử dụng hàm hàm dựng làm hàm đồng bằng, nhưng đó chỉ là cách JavaScript được định nghĩa. Hầu hết các loại ngôn ngữ được cài sẵn có các tính năng bổ sung lạ và không nhất quán như thế này được ném vào.

new Number xây dựng một đối tượng được đóng khung rõ ràng Number. Sự khác biệt:

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

Ngược lại với các lớp học nguyên thủy đóng hộp của Java, JavaScript rõ ràng Number đối tượng là các hoàn toàn không sử dụng.

Tôi sẽ không bận tâm với việc sử dụng Number. Nếu bạn muốn rõ ràng, hãy sử dụng parseFloat('09'); nếu bạn muốn trở thành terse, hãy sử dụng +'09'; nếu bạn chỉ muốn cho phép các số nguyên, hãy sử dụng parseInt('09', 10).

+0

+1, ước gì tôi có thể chấp nhận hai câu trả lời là chính xác vì cả hai câu trả lời đều chính xác và chứa thông tin hữu ích duy nhất. Tôi không biết về việc sử dụng '+' mà không có số trước nó. – Nicole

0

Số (không có mới) dường như không chính xác dẫn đến nguyên thủy. Trong ví dụ sau, anyMethod() được gọi (nếu trong nguyên mẫu Number).

Number(3).anyMethod() 

Trong khi

3.anyMethod() 

sẽ không hoạt động.