2009-05-19 53 views
36

Trong JSLint, nó cảnh báo rằngCó gì sai với var x = new Array();

var x = new Array(); 

(Đó không phải là một tên biến thực) nên

var result = []; 

Điều gì là sai với cú pháp 1? Lý do đằng sau gợi ý là gì?

+2

Không có gì sai với cú pháp thứ nhất. Thứ hai chỉ đơn giản là ngắn hơn. –

Trả lời

26

Crockford doesn't like new. Do đó, JSLint expects you to avoid it khi có thể. Và việc tạo một đối tượng mảng mới là có thể mà không cần sử dụng new ....

+3

Tuy nhiên, jslint bị ngắt khi bạn cố gắng khởi tạo một mảng với n giá trị.Ví dụ: var x = new Array (20); Phương pháp tạo này không được sử dụng thường xuyên, nhưng nó có các trường hợp của nó và nhanh hơn nhiều so với việc sử dụng một vòng lặp để tạo và điền một mảng. –

+3

Bạn chỉ có thể đặt phần tử n'th thành không xác định và nó không nhiều hoặc ít hơn cùng một thứ – mikelikespie

+7

Không cần phải khởi tạo một mảng với kích thước nhất định khi khai báo. Các mảng JavaScript không giống như các mảng C. Chúng là các đối tượng, không phải là các khối bộ nhớ có kích thước tĩnh và tiếp giáp. Bởi vì điều này, bạn chỉ có thể nối thêm các giá trị khi cần thiết cho mảng của bạn. Trong thực tế, nó có thể là * chậm hơn * để khởi tạo tại khai báo và sau đó cư trú bởi vì tại thời điểm khai báo, tất cả các khóa n phải được băm, sau đó khi chúng được gán giá trị, chúng có thể phải được phục hồi. –

69

Đó là an toàn hơn để sử dụng [] hơn là sử dụng new Array(), bởi vì bạn thực sự có thể ghi đè lên giá trị của Array trong JavaScript:

Array = function() { }; 

var x = new Array(); 
// x is now an Object instead of an Array. 

Nói cách khác, [] là rõ ràng.

+0

bạn có thể đưa ra ví dụ không? – TStamper

+0

Điểm tốt! Lưu ý rằng Overriding Array cũng sẽ dẫn đến các vấn đề nghiêm trọng trong mã mà cố gắng sử dụng các phương thức Array.prototype trên các đối tượng giống như mảng chẳng hạn như các đối số ... Vậy vẫn là một ý tưởng rất tồi. – Shog9

+2

Không chỉ vậy, nhưng hàm tạo Array() có một số hành vi "lẻ" tùy thuộc vào số lượng đối số bạn vượt qua nó. Nó chỉ nói chung là kỳ quặc và tránh né tốt nhất. –

2

Không có gì sai với cú pháp đầu tiên. Thực tế, trên w3schools, nó liệt kê new Array() làm cách tạo mảng. Vấn đề là đây là "cách cũ". "Cách mới", [] ngắn hơn và cho phép bạn khởi tạo các giá trị trong mảng, như trong ["foo", "bar"]. Hầu hết các nhà phát triển đều thích [] đến new Array() về mặt phong cách tốt.

+1

Tại sao điều này lại bị giảm? –

+19

có thể vì các trường học w3 không liên quan đến w3.org và chúng thường có mã không chính xác hoặc không chính xác. –

+0

@AndrewAustin Đúng. Mặc dù trong interwebs, như một quy tắc chung của ngón tay cái, bạn nên kiểm tra lại các nguồn, bất kể bạn đã lấy thông tin từ đâu. – Tivie

4

Không có gì sai với một trong hai hình thức, nhưng bạn thường thấy literals sử dụng bất cứ nơi nào possible-

var s = '' không phải là hơn đúng hơn var s = new String() ....

7

Có vẻ như bạn có thể nhận được hiệu suất khác nhau dựa trên việc bạn đang sử dụng và cho mục đích gì tùy thuộc vào trình duyệt hoặc môi trường:

http://jsperf.com/new-array-vs-literal/11 ([1, .2] vs new Array (1, .2)) theo nghĩa đen nhanh hơn trong hoàn cảnh này.

http://jsperf.com/new-array-vs-literal/7 (mảng mới (500000) so với [] .length (500000)) Mảng mới nhanh hơn trong chrome v21 có vẻ như thử nghiệm này khoảng 7% hoặc 30%) tùy thuộc vào việc bạn làm.

+4

+1 dành cho khoa học! –

+1

+1 vì điểm chuẩn thường giúp đưa mọi thứ vào phối cảnh – Tivie

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