2011-01-18 30 views
37

Sự khác nhau giữa new Number()Number() là gì? Tôi nhận được rằng new Number() tạo ra một đối tượng NumberNumber() chỉ là một chức năng, nhưng khi nào tôi nên gọi đó là gì và tại sao?Số mới() so với Số()

Trên một lưu ý liên quan, Mozilla cho biết:

Do not use a Boolean object to convert a non-boolean value to a boolean value. Instead, use Boolean as a function to perform this task. 

x = Boolean(expression);  // preferred 
x = new Boolean(expression); // don't use 

Tại sao vậy? Tôi nghĩ kết quả là như nhau?

Trả lời

40

Boolean(expression) chỉ đơn giản là sẽ chuyển đổi biểu thức thành một boolean giá trị nguyên thủy, trong khi new Boolean(expression) sẽ tạo ra một wrapper đối tượng xung quanh giá trị boolean chuyển đổi.

Sự khác biệt có thể được nhìn thấy với điều này:

// Note I'm using strict-equals 
new Boolean("true") === true; // false 
Boolean("true") === true; // true 

Và cũng với điều này (nhờ @hobbs):

typeof new Boolean("true"); // "object" 
typeof Boolean("true"); // "boolean" 

Lưu ý: Trong khi các đối tượng wrapper sẽ được chuyển đổi với nguyên thủy tự động khi cần thiết (và ngược lại), chỉ có một trường hợp tôi có thể nghĩ đến nơi bạn muốn sử dụng new Boolean, hoặc bất kỳ r wrappers cho nguyên thủy - nếu bạn muốn đính kèm các thuộc tính vào một giá trị duy nhất. Ví dụ:

var b = new Boolean(true); 
b.relatedMessage = "this should be true initially"; 
alert(b.relatedMessage); // will work 

var b = true; 
b.relatedMessage = "this should be true initially"; 
alert(b.relatedMessage); // undefined 
+3

và 'typeof (Boolean (" true ")) ===" boolean "', trong khi 'typeof (new Boolean (" true ")) ===" object "'. – hobbs

+4

"Trong khi đối tượng bao bọc sẽ được chuyển đổi thành nguyên thủy một cách tự động khi cần thiết" Đúng vậy, nhưng hơi gây hiểu lầm. Các đối tượng (bao gồm các đối tượng 'Boolean') luôn luôn đánh giá' true' trong một bối cảnh boolean: 'if (new Boolean (0)) {alert (" Oops, 0 là true. "); } '. Để có được giá trị "mong đợi", hãy gọi 'valueOf':' new Boolean (0) .valueOf() === false' –

25
new Number(x) 

tạo đối tượng trình bao bọc mới. Tôi không nghĩ rằng có một lý do hợp lệ để sử dụng điều này.

Number(x) 

chuyển đổi đối số đã nhập thành giá trị Số. Bạn có thể sử dụng điều này để truyền một số biến sang loại Số. Tuy nhiên điều này được công việc tương tự thực hiện:

+x 

chung:

Bạn không cần những:

new Number() 
new String() 
new Boolean() 

Bạn có thể sử dụng những cho đúc:

Number(value) 
String(value) 
Boolean(value) 

Tuy nhiên, có các giải pháp đơn giản hơn để truyền ing:

+x // cast to Number 
'' + x // cast to String 
!!x // cast to Boolean 
+12

Viết tắt của bạn có thể là _simpler_, nhưng chúng không rõ ràng như sử dụng các hàm Số/Chuỗi/Boolean để thực hiện tương tự. – Nigel

+3

@Nigel Đúng, nhưng trong số các lập trình viên JavaScript, tiền tố '+' để ép buộc Số là phổ biến và (từ những gì tôi có thể thấy) được ưu tiên. –

14

Luôn đáng tham khảo the spec; từ Phần 15.7.1:

Khi được gọi là hàm thay vì là hàm tạo, nó thực hiện chuyển đổi loại.

Tương tự, sử dụng Boolean làm chức năng (15.6.1):

Khi Boolean được gọi là hàm chứ không phải là hàm tạo, nó thực hiện chuyển đổi loại.

... có nghĩa là bạn tham khảo Phần 9.2 ("ToBoolean"):

Các hoạt động trừu tượng ToBoolean chuyển đổi đối số của nó đến một giá trị kiểu Boolean theo Bảng 11:
Undefined = false
Null = false
Boolean = Kết quả bằng đối số đầu vào (không chuyển đổi).
Number = Kết quả sai nếu đối số là +0, −0 hoặc NaN; nếu không kết quả là đúng.
String = Kết quả là sai nếu đối số là Chuỗi rỗng (độ dài của nó bằng 0); nếu không kết quả là đúng.
Object = true

Sự khác biệt giữa new Boolean(value)Boolean(value) là cơ bản mà trở về cựu một đối tượng, nhưng lợi nhuận sau một nguyên thủy mỗi bên trên. vấn đề này, bởi vì đối tượng là truthy:

var b = new Boolean(false); 

display(b);   // Displays "false" 
if (b) { 
    display("true");  // This is the path that gets taken, displaying "true" 
} 
else { 
    display("false"); // This path does NOT get taken 
} 

Live example ... trong khi bạn hầu như luôn luôn muốn các phép toán luận với mục đích thử nghiệm chúng.

Các vấn đề liên quan