Sự khác biệt giữa các Array Array () và và [[] trong khi khai báo một mảng JavaScript là gì?


841

Sự khác biệt thực sự giữa việc khai báo một mảng như thế này là gì:

var myArray = new Array();

var myArray = [];

[]mã thông báo : ARRAY_INIT; new Arraymã thông báo : NEW, IDENTIFIER; new Array()mã thông báo:NEW, IDENTIFIER, CALL
noobninja

Câu trả lời:


951

Có một sự khác biệt, nhưng không có sự khác biệt trong ví dụ đó.

Sử dụng phương thức dài hơn: new Array()có thêm một tùy chọn trong các tham số: nếu bạn chuyển một số cho hàm tạo, bạn sẽ nhận được một mảng có độ dài đó:

x = new Array(5);
alert(x.length); // 5

Để minh họa các cách khác nhau để tạo một mảng:

var a = [],            // these are the same
    b = new Array(),   // a and b are arrays with length 0

    c = ['foo', 'bar'],           // these are the same
    d = new Array('foo', 'bar'),  // c and d are arrays with 2 strings

    // these are different:
    e = [3]             // e.length == 1, e[0] == 3
    f = new Array(3),   // f.length == 3, f[0] == undefined

;

Một điểm khác biệt nữa là khi sử dụng, new Array()bạn có thể đặt kích thước của mảng, điều này ảnh hưởng đến kích thước ngăn xếp. Điều này có thể hữu ích nếu bạn nhận được tràn ngăn xếp ( Hiệu suất của Array.push so với Array.unshift ) là điều xảy ra khi kích thước của mảng vượt quá kích thước của ngăn xếp và nó phải được tạo lại. Vì vậy, thực sự có thể, tùy thuộc vào trường hợp sử dụng, có thể tăng hiệu suất khi sử dụng new Array()vì bạn có thể ngăn chặn tràn.

Như đã chỉ ra trong câu trả lời này , new Array(5)sẽ không thực sự thêm năm undefinedmục vào mảng. Nó chỉ đơn giản là thêm không gian cho năm mục. Hãy lưu ý rằng sử dụng cách Arraynày gây khó khăn array.lengthcho việc tính toán.


66
Điều này hơi sai. Có một sự khác biệt rất quan trọng giữa Array mới () và [] Tôi sẽ giải thích chi tiết trong câu trả lời của mình.
coderjoe

30
Nhưng như đã lưu ý trong câu trả lời của bạn, nó chỉ khác nếu bạn hoàn toàn điên loạn và ghi đè lên hàm Array ..?
nickf

19
Điều quan trọng là việc sử dụng toán tử mới làm cho trình thông dịch thực hiện tất cả các loại bước bổ sung để đi đến phạm vi toàn cầu, tìm kiếm hàm tạo, gọi hàm tạo và gán kết quả ... trong trường hợp đa số sẽ xảy ra aa mảng thời gian chạy. Bạn có thể tránh được chi phí tìm kiếm nhà xây dựng toàn cầu chỉ bằng cách sử dụng []. Nó có vẻ nhỏ, nhưng khi bạn chụp cho hiệu suất gần thời gian thực trong ứng dụng của mình, nó có thể tạo ra sự khác biệt.
coderjoe

5
Có một sự khác biệt lớn về hiệu suất: jsperf.com/create-an-array-of-initial-size/2
Marco Luglio

4
Đúng, nhưng bạn cũng không cần dấu chấm phẩy hoặc ngắt dòng ở hầu hết các nơi tôi thêm chúng. Đó là về tính nhất quán và mức độ dễ đọc. Bạn biết đấy, IMHO.
nickf

774

Sự khác biệt giữa việc tạo một mảng với mảng ẩn và hàm tạo mảng là tinh tế nhưng quan trọng.

Khi bạn tạo một mảng bằng cách sử dụng

var a = [];

Bạn đang nói với trình thông dịch để tạo một mảng thời gian chạy mới. Không cần xử lý thêm. Làm xong.

Nếu bạn dùng:

var a = new Array();

Bạn đang nói với trình thông dịch, tôi muốn gọi hàm tạo " Array" và tạo một đối tượng. Sau đó, nó tìm kiếm thông qua bối cảnh thực hiện của bạn để tìm hàm tạo để gọi và gọi nó, tạo mảng của bạn.

Bạn có thể nghĩ "Chà, điều này hoàn toàn không thành vấn đề. Chúng giống nhau!". Thật không may, bạn không thể đảm bảo điều đó.

Lấy ví dụ sau:

function Array() {
    this.is = 'SPARTA';
}

var a = new Array();
var b = [];

alert(a.is);  // => 'SPARTA'
alert(b.is);  // => undefined
a.push('Woa'); // => TypeError: a.push is not a function
b.push('Woa'); // => 1 (OK)

Trong ví dụ trên, cuộc gọi đầu tiên sẽ cảnh báo 'SPARTA' như bạn mong đợi. Thứ hai sẽ không. Bạn cuối cùng sẽ thấy không xác định. Bạn cũng sẽ lưu ý rằng b chứa tất cả các hàm đối tượng Array gốc, chẳng hạn như pushcác hàm khác không có.

Mặc dù bạn có thể mong đợi điều này xảy ra, nhưng nó chỉ minh họa thực tế []không giống như new Array().

Có lẽ tốt nhất là chỉ sử dụng []nếu bạn biết bạn chỉ muốn một mảng. Tôi cũng không đề xuất đi xung quanh và xác định lại Mảng ...


157
Vâng, tốt để biết tôi cho rằng. Loại người nào sẽ ghi đè lên lớp mảng, tôi không biết ...
nickf

160
Bạn hoàn toàn đúng. Chỉ có một người điên mới ghi đè lên lớp mảng. Bây giờ hãy dành một chút thời gian và xem xét tất cả các công việc bổ sung bằng cách sử dụng Array mới () khiến trình thông dịch làm để hỗ trợ những kẻ điên này. Tôi chỉ tránh tất cả cùng với [].
coderjoe

51
Ví dụ điển hình về loại ô nhiễm toàn cầu có thể xảy ra với JavaScript.
David Snabel-Caunt

8
Đáng lưu ý rằng Mảng mới (kích thước) nhanh hơn các phương thức có thể khác bằng cách sử dụng ký hiệu []. Nguồn: jsperf.com/create-an-array-of-initial-size/2
Marco Luglio

9
Thật không may, bài kiểm tra đó được chuẩn bị không đúng cách. Đó là thử nghiệm khởi tạo Mảng với khởi tạo mảng sau đó là truy cập Mảng. Không có quyền kiểm soát để chứng minh rằng các trình duyệt thực sự phân bổ trước bộ nhớ (điều mà đặc tả không nói họ phải làm). Nếu chúng ta có thể giả sử rằng truy cập mảng là không đổi và phần lớn thời gian sẽ được dành cho việc phân bổ bộ nhớ trong cả hai ví dụ thì [] có thể thích hợp hơn nếu bạn đang khởi tạo hàng triệu mảng. jsperf.com/array-instanciation
coderjoe

95

Có một sự khác biệt quan trọng mà chưa có câu trả lời nào được đề cập.

Từ đây:

new Array(2).length           // 2
new Array(2)[0] === undefined // true
new Array(2)[1] === undefined // true

Bạn có thể nghĩ rằng new Array(2)tương đương với [undefined, undefined], nhưng nó KHÔNG!

Hãy thử với map():

[undefined, undefined].map(e => 1)  // [1, 1]
new Array(2).map(e => 1)            // "(2) [undefined × 2]" in Chrome

Xem? Các ngữ nghĩa là hoàn toàn khác nhau! Vậy tại sao vậy?

Theo ES6 Spec 22.1.1.2, công việc của Array(len)chỉ là tạo một mảng mới có thuộc tính lengthđược đặt thành đối số lenvà đó là nó, có nghĩa là không có bất kỳ yếu tố thực sự nào trong mảng mới được tạo này.

Chức năng map(), theo thông số 22.1.3.15 trước tiên sẽ kiểm tra HasPropertysau đó gọi lại cuộc gọi, nhưng hóa ra là:

new Array(2).hasOwnProperty(0) // false
[undefined, undefined].hasOwnProperty(0) // true

Và đó là lý do tại sao bạn không thể mong đợi bất kỳ hàm lặp nào hoạt động như bình thường trên các mảng được tạo từ đónew Array(len) .

BTW, Safari và Firefox có cách "in" tốt hơn cho tình huống này:

// Safari
new Array(2)             // [](2)
new Array(2).map(e => 1) // [](2) 
[undefined, undefined]   // [undefined, undefined] (2) 

// Firefox
new Array(2)             // Array [ <2 empty slots> ]
new Array(2).map(e => 1) // Array [ <2 empty slots> ]
[undefined, undefined]   // Array [ undefined, undefined ]

Tôi đã gửi một vấn đề tới Chromium và yêu cầu họ khắc phục lỗi in khó hiểu này: https://bugs.chromium.org/p/chromium/issues/detail?id=732021

CẬP NHẬT: Nó đã được sửa. Chrome hiện được in dưới dạng:

new Array(2)             // (2) [empty × 2]

22
Của bạn là câu trả lời thực tế duy nhất
Victor

Điều này có ý nghĩa, tôi chỉ va vào một cấu trúc khác mà tôi không thể tìm thấy tài liệu tham khảo cho: [...Array(2)]tương đương với [undefined, undefined]quan điểm kết quả.
Roberto Andrade

Có vẻ như câu trả lời cho các bình luận trước đây của tôi là "Toán tử lây lan": javascript.info/rest-parameter-s
Roberto Andrade

@RobertoAndrade có ý nghĩa bởi vì toán tử trải rộng sẽ cần phải đọc ra các mục để nó có thể áp dụng sao chép như vậy ... và đọc trở lại khe trống như vậy undefinednhư bình thường.
Hux

51

Thật kỳ lạ, new Array(size)nhanh hơn gần gấp đôi so với []Chrome và tương tự trong FF và IE (được đo bằng cách tạo và điền vào một mảng). Nó chỉ quan trọng nếu bạn biết kích thước gần đúng của mảng. Nếu bạn thêm nhiều mục hơn độ dài bạn đã cung cấp, hiệu suất tăng sẽ bị mất.

Chính xác hơn: Array(là một hoạt động thời gian liên tục nhanh không phân bổ bộ nhớ, máy ảnh []là hoạt động thời gian tuyến tính đặt loại và giá trị.


3
Tôi đã thử nghiệm nó rất nhiều trong Node.js: khi bạn cần đặt một số lượng vật phẩm vào mảng, new Array(length)trên 0 <= size <= ~ 1000, trên kích thước> ~ 1000 trận thắng[]
glukki


40

Để biết thêm thông tin, trang sau mô tả lý do tại sao bạn không bao giờ cần sử dụngnew Array()

Bạn không bao giờ cần phải sử dụng new Object()trong JavaScript. Sử dụng các đối tượng theo nghĩa đen {} thay thế. Tương tự, không sử dụng new Array(), [] thay vào đó hãy sử dụng mảng bằng chữ . Mảng trong JavaScript hoạt động không giống như các mảng trong Java và việc sử dụng cú pháp giống như Java sẽ khiến bạn bối rối.

Không sử dụng new Number, new Stringhoặc new Boolean. Các hình thức này tạo ra các hàm bao đối tượng không cần thiết. Chỉ cần sử dụng chữ đơn giản để thay thế.

Ngoài ra, hãy kiểm tra các nhận xét - new Array(length)biểu mẫu không phục vụ bất kỳ mục đích hữu ích nào (ít nhất là trong các triển khai JavaScript ngày nay).


3
Crockford, cũng, nói rằng sử dụng [] thay vì Array mới (). Thật không may, ông không nói lý do tại sao trong bài viết liên kết. Tôi cho rằng đó chỉ là vấn đề không gian và tốc độ. javascript.crockford.com/code.html
Nosredna

4
Crockford không phải là người hâm mộ sử dụng từ khóa "mới" để tạo một phiên bản mới của một đối tượng trong Javascript. Trong các bài giảng, ông nói rằng niềm tin của mình rằng nó tạo ra sự mơ hồ và không phù hợp với sự kế thừa kiểu nguyên mẫu của Javascript. Anh đặc biệt đề cập đến các hàm tạo đối tượng do người dùng tạo, nhưng với niềm tin đó, thật dễ hiểu tại sao anh ta khuyên bạn không nên sử dụng nó với các hàm dựng sẵn khi có cú pháp thay thế.
Alan Storm

@Alan Storm: ít nhất là đối với Number, String và Boolean, anh ta nói rằng "các hình thức này tạo ra các trình bao bọc đối tượng không cần thiết", nhưng tôi đoán rằng điều đó sẽ không áp dụng cho Array.
BarelyFitz

10

Để hiểu rõ hơn []new Array():

> []
  []
> new Array()
  []
> [] == []
  false
> [] === []
  false
> new Array() == new Array()
  false
> new Array() === new Array()
  false
> typeof ([])
  "object"
> typeof (new Array())
  "object"
> [] === new Array()
  false
> [] == new Array()
  false

Kết quả trên là từ bảng điều khiển Google Chrome trên Windows 7.


4
nhưng tại sao [] == [] hoặc [] === [] sai?
anu

5
"Một biểu thức so sánh các Đối tượng chỉ đúng nếu các toán hạng tham chiếu cùng một Đối tượng." (nguồn: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
mẹo

Câu trả lời này chọn các ví dụ anh đào để ngụ ý rằng hai cấu trúc giống hệt nhau. Các bài đăng khác trên trang này chỉ ra sự khác biệt, chẳng hạn như Array(3)hoặc new Array(3)không giống như [3].
ggorlen

8

Đầu tiên là cuộc gọi xây dựng đối tượng mặc định. Bạn có thể sử dụng tham số của nó nếu bạn muốn.

var array = new Array(5); //initialize with default length 5

Cái thứ hai cung cấp cho bạn khả năng tạo mảng không trống:

var array = [1, 2, 3]; // this array will contain numbers 1, 2, 3.

1
Bạn có thể làm điều tương tự với hàm tạo verbose: var mảng = new Array (1, 2, 3);
nickf

Vì vậy, tôi đoán bạn có thể thực hiện var array = [5]bằng cách sử dụng dấu ngoặc vuông nhưng không sử dụng hàm tạo như var array = Array(5)tạo một mảng trống gồm 5 phần tử.
cdmckay

cdmckay - điều đó không chính xác. var a = [5] sẽ là một mảng với một mục duy nhất - số năm.
BarelyFitz

2
@BarelyFitz: Đó là những gì tôi nói. Trong câu trả lời của Bogdans, anh ta nói rằng lệnh gọi của hàm tạo không thể được sử dụng để kích hoạt một mảng, nhưng anh ta đã sai. Nhận xét của tôi chỉ đơn thuần là để làm rõ rằng bạn không thể sử dụng lệnh gọi hàm tạo để khởi tạo một mảng của một phần tử.
cdmckay

1
@cdmckay: xin lỗi, tôi hiểu nhầm ý kiến ​​của bạn. Để làm rõ: new Array (arg) - nếu arg là số, điều này tạo ra một mảng trống có length = arg; new Array (arg1, arg2) - tạo một mảng mới và khởi tạo các phần tử mảng. Vì vậy, nếu bạn muốn tạo một mảng với một phần tử số như [5], bạn không thể thực hiện bằng mảng mới (5). Nhưng thực sự bạn không bao giờ nên sử dụng Array () mới vì vậy đây là điểm moot.
BarelyFitz

5

Tôi có thể giải thích một cách cụ thể hơn bắt đầu với ví dụ này dựa trên ví dụ hay của Fredrik.

var test1 = [];
test1.push("value");
test1.push("value2");

var test2 = new Array();
test2.push("value");
test2.push("value2");

alert(test1);
alert(test2);
alert(test1 == test2);
alert(test1.value == test2.value);

Tôi vừa thêm một giá trị khác vào các mảng và đưa ra bốn cảnh báo: Thứ nhất và thứ hai là cung cấp cho chúng tôi giá trị được lưu trữ trong mỗi mảng, để chắc chắn về các giá trị. Họ sẽ trở lại như cũ! Bây giờ hãy thử cái thứ ba, nó trả về false, đó là vì

JS coi test1 là một VARIABLE với kiểu dữ liệu của mảng và nó coi test2 là một ĐỐI TƯỢNG với chức năng của một mảng và có một vài khác biệt nhỏ ở đây.

Sự khác biệt đầu tiên là khi chúng ta gọi test1, nó gọi một biến mà không cần suy nghĩ, nó chỉ trả về các giá trị được lưu trữ trong biến này mà không quan tâm đến kiểu dữ liệu của nó! Nhưng, khi chúng ta gọi test2, nó gọi hàm Array () và sau đó nó lưu các giá trị "Đã đẩy" của chúng ta vào thuộc tính "Giá trị" và điều tương tự xảy ra khi chúng ta cảnh báo test2, nó trả về thuộc tính "Giá trị" của đối tượng mảng.

Vì vậy, khi chúng tôi kiểm tra xem test1 có bằng test2 hay không, tất nhiên chúng sẽ không bao giờ trả về true, một là hàm và biến còn lại là một biến (với một loại mảng), ngay cả khi chúng có cùng giá trị!

Để chắc chắn về điều đó, hãy thử cảnh báo thứ 4, với .value được thêm vào nó; nó sẽ trở lại đúng Trong trường hợp này, chúng tôi nói với JS "Bỏ qua loại container, cho dù đó là chức năng hay biến, vui lòng so sánh các giá trị được lưu trữ trong mỗi container và cho chúng tôi biết những gì bạn đã thấy!" đó chính xác là những gì xảy ra.

Tôi hy vọng tôi đã nói rõ ý tưởng đằng sau đó và xin lỗi vì tiếng Anh của tôi không tốt.


19
Thật đáng kinh ngạc khi những điều vô nghĩa hoàn toàn và vô nghĩa như vậy đã được bình chọn. So sánh giữa các mảng sẽ là sai cho dù bạn tạo chúng như thế nào vì nó so sánh danh tính đối tượng và chúng là các đối tượng khác nhau. Mảng không có giá trị tài sản. []new Array()giống hệt nhau; .valuesẽ undefinedtrong cả hai trường hợp và so sánh chúng sẽ luôn sai.
slikts

Đồng ý, câu trả lời này không có ý nghĩa và không cho thấy gì. Không có những thứ như array.value. và cả hai typeof []typeof new Array()trở về object. Đó là một trong những lý do tại sao có một chức năng được gọi làArray.isArray
gman

4

Không có sự khác biệt khi bạn khởi tạo mảng mà không có độ dài. Vì vậy var a = []& var b = new Array()là như nhau.

Nhưng nếu bạn khởi tạo mảng với độ dài như thế var b = new Array(1);, nó sẽ đặt độ dài của đối tượng mảng thành 1. Vì vậy, nó tương đương với var b = []; b.length=1;.

Điều này sẽ có vấn đề bất cứ khi nào bạn thực hiện Array_object.push, nó thêm mục sau phần tử cuối cùng & tăng chiều dài.

var b = new Array(1);
b.push("hello world");
console.log(b.length); // print 2

đấu với

var v = [];
a.push("hello world");
console.log(b.length); // print 1

3

Cái đầu tiên là hàm tạo đối tượng mặc định call.ely được sử dụng cho các giá trị động.

var array = new Array(length); //initialize with default length

mảng thứ hai được sử dụng khi tạo các giá trị tĩnh

var array = [red, green, blue, yellow, white]; // this array will contain values.

3

Không có sự khác biệt lớn, về cơ bản họ làm điều tương tự nhưng thực hiện chúng theo những cách khác nhau, nhưng đọc tiếp, hãy xem tuyên bố này tại W3C:

var cars = ["Saab", "Volvo","BMW"];

var cars = new Array("Saab", "Volvo", "BMW");

Hai ví dụ trên làm chính xác như nhau. Không cần sử dụng Array mới ().
Để đơn giản, dễ đọc và tốc độ thực thi, hãy sử dụng phương thức đầu tiên (phương thức mảng bằng chữ).

Nhưng đồng thời, tạo mảng mới bằng cách sử dụng new Arraycú pháp được coi là một thực tiễn xấu:

Tránh mảng mới ()

Không cần sử dụng trình xây dựng mảng dựng sẵn của JavaScript Array mới ().
Sử dụng [] thay thế.
Cả hai câu lệnh khác nhau này đều tạo ra một mảng trống mới có tên điểm:

var points = new Array();         // Bad
var points = [];                  // Good 

Cả hai câu lệnh khác nhau đều tạo ra một mảng mới chứa 6 số:

var points = new Array(40, 100, 1, 5, 25, 10); // Bad    
var points = [40, 100, 1, 5, 25, 10];          // Good

Các từ khóa mới chỉ làm phức tạp mã. Nó cũng có thể tạo ra một số kết quả bất ngờ:

var points = new Array(40, 100);  // Creates an array with two elements (40 and 100)

Nếu tôi loại bỏ một trong các yếu tố thì sao?

var points = new Array(40);       // Creates an array with 40 undefined elements !!!!!

Vì vậy, về cơ bản không được coi là thực tiễn tốt nhất, cũng có một sự khác biệt nhỏ ở đó, bạn có thể vượt qua độ dài để new Array(length)thích điều này, đó cũng không phải là một cách được khuyến nghị.


Xin chào Alireza, những thứ này được sao chép và dán từ đâu đó? Vui lòng thêm một liên kết đến trang nơi văn bản được sao chép từ đó. Xem trang trung tâm trợ giúp này để biết chi tiết. Cảm ơn bạn.
Pang

Hữu ích chonew Array(40).fill(123)
gman

2

Sự khác biệt của việc sử dụng

var arr = new Array(size);

Hoặc là

arr = [];
arr.length = size;

Như đã được thảo luận đủ trong câu hỏi này.

Tôi muốn thêm vấn đề tốc độ - cách nhanh nhất hiện tại , google chromelà cách thứ hai.

Nhưng hãy chú ý, những điều này có xu hướng thay đổi rất nhiều với các bản cập nhật. Ngoài ra thời gian chạy sẽ khác nhau giữa các trình duyệt khác nhau.

Ví dụ: tùy chọn thứ 2 mà tôi đã đề cập, chạy ở mức 2 triệu [ops / giây] chrome, nhưng nếu bạn thử nó, mozilla dev.bạn sẽ nhận được tỷ lệ cao hơn đáng ngạc nhiên là 23 triệu.

Dù sao, tôi khuyên bạn nên kiểm tra nó, thỉnh thoảng, trên các trình duyệt (và máy) khác nhau, sử dụng trang web như vậy


2

Như tôi biết diference u có thể tìm thấy những lát (hoặc funcitons khác của Array) như code1 .và code2 hiển thị u Mảng và mình trường hợp :

mã1:

[].slice; // find slice here
var arr = new Array();
arr.slice // find slice here
Array.prototype.slice // find slice here

mã2:

[].__proto__ == Array.prototype; // true
var arr = new Array();
arr.__proto__ == Array.prototype; // true

phần kết luận:

như bạn có thể thấy []new Array()tạo một phiên bản mới của Array. Và tất cả họ đều nhận được các hàm nguyên mẫu từArray.prototype

Chúng chỉ là ví dụ khác nhau của Array.so điều này giải thích tại sao [] != []

:)


2

Tôi đã phải chịu một hành vi kỳ lạ khi sử dụng [].

Chúng tôi có Mô hình "lớp" với các trường được khởi tạo cho một số giá trị. Ví dụ:

require([
  "dojo/_base/declare",
  "dijit/_WidgetBase",
], function(declare, parser, ready, _WidgetBase){

   declare("MyWidget", [_WidgetBase], {
     field1: [],
     field2: "",
     function1: function(),
     function2: function()
   });    
});

Tôi thấy rằng khi các trường được khởi tạo cùng với []nó thì nó sẽ được chia sẻ bởi tất cả các đối tượng Model. Thay đổi một trong những ảnh hưởng đến tất cả những người khác.

Điều này không xảy ra khi khởi tạo chúng với new Array(). Tương tự cho việc khởi tạo Đối tượng ( {}so với mới Object())

TBH Tôi không chắc đó có phải là vấn đề với khung mà chúng tôi đang sử dụng không ( Dojo )


2

Có nhiều thứ hơn là bắt mắt. Hầu hết các câu trả lời khác đều đúng NHƯNG ..

new Array(n)

  • Cho phép động cơ phân bổ lại không gian cho ncác phần tử
  • Tối ưu hóa cho việc tạo mảng
  • Mảng được tạo được đánh dấu thưa thớt có hoạt động mảng ít hiệu quả nhất, đó là vì mỗi truy cập chỉ mục phải kiểm tra giới hạn, xem giá trị có tồn tại và đi theo chuỗi nguyên mẫu không
  • Nếu mảng được đánh dấu là thưa thớt, không có cách nào quay lại (ít nhất là trong V8), nó sẽ luôn chậm hơn trong suốt vòng đời của nó, ngay cả khi bạn lấp đầy nó bằng nội dung (mảng đóng gói) 1ms hoặc 2 giờ sau, không thành vấn đề

[1, 2, 3] || []

  • Mảng được tạo được đánh dấu đóng gói (trừ khi bạn sử dụng deletehoặc [1,,3]cú pháp)
  • Tối ưu hóa cho mảng hoạt động ( for .., forEach, map, vv)
  • Động cơ cần phân bổ lại không gian khi mảng phát triển

Đây có lẽ không phải là trường hợp cho các phiên bản / trình duyệt cũ hơn.


-2

Tôi đã tìm thấy một sự khác biệt giữa hai công trình khiến tôi khá khó khăn.

Hãy nói rằng tôi có:

function MyClass(){
  this.property1=[];
  this.property2=new Array();
};
var MyObject1=new MyClass();
var MyObject2=new MyClass();

Trong cuộc sống thực, nếu tôi làm điều này:

MyObject1.property1.push('a');
MyObject1.property2.push('b');
MyObject2.property1.push('c');
MyObject2.property2.push('d');

Những gì tôi kết thúc là đây:

MyObject1.property1=['a','c']
MyObject1.property2=['b']
MyObject2.property1=['a','c']
MyObject2.property2=['d']

Tôi không biết đặc tả ngôn ngữ nói gì sẽ xảy ra, nhưng nếu tôi muốn hai đối tượng của mình có mảng thuộc tính duy nhất trong các đối tượng của mình, tôi phải sử dụng new Array().


JSFiddle này cho thấy rằng đầu ra là những gì bạn mong đợi với mảng []và hàm new Array()tạo, dẫn đến một mục trên mỗi mảng trên mỗi thuộc tính. Bạn phải có một cái gì đó khác đang diễn ra trong mã của bạn để kết thúc với kết quả bạn hiển thị ở trên.
gfullam

Bucky, điều đó không xảy ra với tôi, trong bất kỳ trình duyệt nào. Để có được hành vi đó, bạn phải làm một cái gì đó như thế này: var property1static=[]; function MyClass(){ this.property1=property1static; this.property2=new Array(); };
Dave Burton

-3

Việc sử dụng hàm tạo Array tạo ra một mảng mới có độ dài mong muốn và điền vào từng chỉ số không xác định, mảng được gán cho một biến sẽ tạo ra các chỉ mục mà bạn cung cấp cho nó thông tin.


1
Không, mảng KHÔNG được điền, không có chỉ mục / khóa bên trong. Ví dụ .forEach sẽ không hoạt động.
CFrei
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.