2012-07-16 28 views
172

Khi tôi cần phải khai báo một mảng mới tôi sử dụng ký hiệu nàyCác phương pháp hay nhất để làm theo khi khai báo một mảng trong Javascript là gì?

var arr = new Array(); 

Nhưng khi kiểm tra trực tuyến, ví dụ trên jsbin, một tín hiệu cảnh báo tôi "Sử dụng các mảng ký hiệu đen []."

Tôi không tìm thấy lý do để tránh sử dụng hàm tạo. Một cách nào đó kém hiệu quả hơn việc sử dụng []? Hoặc là thực hành xấu?

Có lý do chính đáng để sử dụng var arr = []; thay vì var arr = new Array(); không?

+5

Cả hai đều ổn. Bạn chỉ cần lưu một số byte trong truyền dẫn. – Sirko

+13

Có thực sự khác biệt. Xem bài đăng này: http://stackoverflow.com/q/2280285/921204 – techfoobar

+0

Lưu ý: có sự khác biệt * nếu Array đã bị ghi đè * chỉ. – crdx

Trả lời

257

Chủ yếu là, mọi người sử dụng var a = []Douglas Crockford says so.

lý do của ông bao gồm các hành vi phi trực quan và không phù hợp của new Array():

var a = new Array(5);  // an array pre-sized to 5 elements long 
var b = new Array(5, 10); // an array with two elements in it 

Lưu ý rằng không có cách nào với new Array() để tạo ra một mảng với chỉ một yếu tố số tiền quy định tại nó!

Sử dụng [] thực sự hiệu quả hơn, and safer too! Có thể ghi đè lên constructor Array và làm cho nó làm những điều kỳ quặc, nhưng bạn không thể ghi đè lên hành vi của [].

Cá nhân, tôi luôn sử dụng cú pháp [] và tương tự luôn sử dụng cú pháp {} thay cho new Object().

+5

"bạn không thể ghi đè hành vi của []." Bạn có chắc về điều này? Tôi nghĩ rằng bạn có thể ghi đè lên constructor Array để ảnh hưởng đến [], và constructor Object ảnh hưởng đến {}, ít nhất là trên một số triển khai. – Random832

+11

@ Random832 có thể trong các trình duyệt cũ hơn, nhưng không phải trong các triển khai tương thích ES5, trong đó spec nói rằng '[]' gọi một hàm tạo bên trong, không phải bất kỳ giá trị 'Array.constructor' nào xảy ra tại thời điểm đó. – Alnitak

+5

** Tiền thưởng: ** Các ký tự mảng nhanh hơn nhiều so với việc tạo mảng mới bằng cách sử dụng hàm tạo 'Array': http://jsperf.com/new-array –

4

Có giới hạn mà hàm tạo có thể lấy làm đối số.

Trên hầu hết các hệ thống I vải trên thị trường giới hạn là 2^16 (2 byte):

var myFreshArr = new Array(0,1,2,3 ..... 65536); 

Điều đó sẽ gây ra một lỗi (quá nhiều tranh cãi ....)

Khi sử dụng theo nghĩa đen [ ] bạn không có vấn đề như vậy.

Trong trường hợp bạn không quan tâm đến các mảng lớn như vậy, tôi nghĩ bạn có thể sử dụng bất cứ điều gì bạn thích.

+2

Bạn có thể trích dẫn ví dụ về nơi một người có thể hợp lý muốn tạo một mảng được điền trước với 70.000 giá trị không? Mặc dù, nó thực sự giải thích một số các trang web khủng khiếp tôi đã nhìn thấy rằng dường như không bao giờ kết thúc tải ... –

+0

@ John: định vị zipcode là một trong những trường hợp tôi có thể nghĩ đến. –

+2

John O, tôi đã thấy một số triển khai JSON SCARY trong thời gian của tôi, liên quan đến mảng mảng 2D/3D, có mã IATA (sân bay), hãng hàng không-công ty, nhà điều hành tour du lịch, khu nghỉ dưỡng, v.v ... ... tất cả nhồi vào một mảng. Đó là ... ... 1MB + lượt tải xuống JSON khiến tôi muốn khóc. – Norguard

3

Đó là vì new Array() không rõ ràng. Đây là những người xây dựng chính xác:

// Using brackets 
[element0, element1, ..., elementN] 

// Using new AND a list of elements 
new Array(element0, element1, ..., elementN) 

// Using new AND an integer specifying the array length 
new Array(arrayLength) 
12

Không, thực sự không có lý do gì để sử dụng một ký hiệu so với ký pháp còn lại cho mảng trống.

Tuy nhiên, hầu hết các trình duyệt hiển thị một màn trình diễn tốt hơn một chút bằng x = []; hơn gọi Constructor.

Nếu bạn cần tạo một Mảng có kích thước cụ thể, bạn cần cần để sử dụng x = new Array(10); ví dụ, sẽ tạo một mảng với 10 undefined vị trí.

+3

hoặc 'x = []; x.length = 10' – Alnitak

+0

@Alnitak: mà bạn đã đề cập, không phải là rất trực quan và súc tích. – jAndy

+7

Tôi đặt cùng một jsperf để so sánh hiệu suất: http://jsperf.com/array-constructor-versus-literal. Ít nhất là đối với tôi trên Chrome 20 trên Ubuntu, chữ này nhanh gấp hai lần so với hàm tạo. –

6

Cả hai đều chỉ đúng.Nhưng hầu hết mọi người sử dụng var a = []

Ba cách để khai báo mảng trong JavaScript.

phương pháp 1: Chúng tôi có thể tuyên bố rõ ràng một mảng với từ khóa "mới" JavaScript để khởi tạo mảng trong bộ nhớ (ví dụ: tạo nó và làm cho nó có sẵn).

// Declare an array (using the array constructor) 
var arlene1 = new Array(); 
var arlene2 = new Array("First element", "Second", "Last"); 

phương pháp 2: chúng tôi sử dụng một phương pháp thay thế để khai báo mảng.

// Declare an array (using literal notation) 
var arlene1 = []; 
var arlene2 = ["First element", "Second", "Last"]; 

phương pháp 3: JavaScript cũng cho phép bạn tạo ra các mảng gián tiếp, bằng cách gọi phương pháp cụ thể.

// Create an array from a method's return value 
var carter = "I-learn-JavaScript"; 
var arlene3 = carter.split("-"); 
6
  • var arr = [] sử dụng mảng/object literal
  • var arr = new Array() sử dụng các nhà xây dựng mảng/đối tượng

Cách nhanh nhất để xác định một mảng hoặc đối tượng là cách theo nghĩa đen, bởi vì bạn không cần gọi cho nhà xây dựng

var arr1 = new Array(1, 2, 3, 4); 
var arr2 = [1, 2, 3, 4]; 

alert(arr1[0]); // 1 
alert(arr2[0]); // 1 

var arr3 = new Array(200); 
var arr4 = [200]; 

alert(arr3[0]); // 'undefined' 
alert(arr4[0]); // 200 
+2

Để tham khảo, đằng sau hậu trường, 'var arr = [];' logic sử dụng một hàm tạo.Nó chỉ là * luôn luôn * được xây dựng trong mảng xây dựng, chứ không phải là bất cứ chức năng hiện đang đi theo tên 'Array'. – cHao

4
var array = [ 1, 2, 3, 4]; 

là đường

var array = new Array(1, 2, 3, 4); 

là muối

+5

và nơi để sử dụng, cho cà phê hoặc mì ống? – Aristos

+0

đường cú pháp và muối – linquize

48

Một khác biệt đáng kể là [] sẽ luôn khởi tạo một mảng mới, trong khi new Array có thể hijacked to create a different object.

(function() { 
    "use strict"; 
    var foo, 
     bar; 
    //don't do this, it's a bad idea 
    function Array() { 
     alert('foo'); 
    } 
    foo = new Array(); 
    bar = []; 
}());​ 

Trong mã ví dụ của tôi, tôi đã giữ Array chức năng ẩn từ phần còn lại của phạm vi tài liệu, tuy nhiên nó nhiều khả năng rằng nếu bạn từng gặp phải loại này của vấn đề mà các mã sẽ không có được còn lại trong một đóng cửa tốt đẹp, và rất có thể sẽ khó khăn để xác định vị trí.

Tuyên bố từ chối: Không nên bỏ qua công cụ xây dựng Array.

+7

IIRC, trong các trình duyệt cũ ghi đè lên hàm tạo mảng cũng sẽ làm cho các chữ được hiểu sai. Có một lỗ hổng CSRF của GMail [dễ bị tổn thương] (http://jeremiahgrossman.blogspot.com.br/2006/01/advanced-web-attack-techniques-using.html) một lúc trước, việc ghi đè lên hàm tạo mảng và các trình duyệt mới bỏ qua quá tải cho các nguyên văn vì lý do chính xác này. – hugomg

+0

Tuyên bố từ chối trách nhiệm: tuy nhiên, điều này hoàn toàn hữu ích và hữu ích để nâng cao trình tạo mảng Array trong những năm qua. –

26

cho bảo trì, sử dụng []

Mảng đen là dễ dự đoán hơn, như hầu hết các nhà phát triển sử dụng nó. Hầu hết việc sử dụng mảng ra sẽ sử dụng chữ, và có giá trị trong việc mã của bạn phù hợp với những gì các nhà phát triển khác sử dụng.

cho mảng trống rỗng, sử dụng []

var ns = []; 
var names = [ 'john', 'brian' ]; 

Như here, sử dụng theo nghĩa đen cho trống và một vài yếu tố được biết đến là fatster hơn các nhà xây dựng Array.

cho một loạt các kích thước đã biết, sử dụng new Array(size)

Nếu kích thước được biết đến, sau đó sử dụng các nhà xây dựng Mảng cải thiện đáng kể hiệu suất. Tuy nhiên nó cũng có nghĩa là bạn phải đối phó với một mảng mà đã có 'không xác định' điền tất cả các giá trị của nó.

Như here

// fill an array with 100 numbers 
var ns = new Array(100); 
for (var i = 0; i < 100; i++) { 
    ns[i] = i; 
} 

này cũng làm việc cho very small arrays too.

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