Tạo một đối tượng trống trong JavaScript bằng {} hoặc Object mới ()?


370

hai cách khác nhau để tạo một đối tượng trống trong JavaScript:

var objectA = {}
var objectB = new Object()

Có sự khác biệt nào trong cách công cụ script xử lý chúng không? Có bất kỳ lý do để sử dụng cái này hơn cái kia không?

Tương tự, cũng có thể tạo một mảng trống bằng cách sử dụng cú pháp khác nhau:

var arrayA = []
var arrayB = new Array()

6
Cảnh báo: có một sự khác biệt nhỏ có thể gây ra lỗi rất khó chịu! Tạo một đối tượng trống gán nó cho "{}" trong nguyên mẫu Đối tượng sẽ là cùng một đối tượng Đối tượng trong mọi đối tượng Đối tượng được tạo bởi toán tử "mới". Trong khi bạn sử dụng "Đối tượng mới ({})", bạn sẽ có các trường hợp khác nhau.
peterh - Phục hồi Monica

Đáng nói là ngoài ra còn var objectA = {} var objectB = new Object()có một công trình thứ ba sẽ tạo ra kết quả tương tự:var objectC = Object.create(Object.prototype);
kalitsov

{}[] sử dụng {}thay vì new Object(). Sử dụng []thay vì new Array(). Sử dụng mảng khi tên thành viên sẽ là số nguyên tuần tự. Sử dụng các đối tượng khi tên thành viên là các chuỗi hoặc tên tùy ý. nguồn
ilgaar

new Object(){}không phải là các đối tượng hoàn toàn trống rỗng, chúng là các đối tượng có Object.prototype. Bạn có thể sử dụng Object.create(null)cho một đối tượng thực sự trống rỗng (ít nhất là theo tài liệu mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ .)

Câu trả lời:


459

Các đối tượng

Không có lợi ích gì khi sử dụng new Object();- trong khi đó {};có thể làm cho mã của bạn gọn hơn và dễ đọc hơn.

Để xác định các đối tượng trống, chúng giống nhau về mặt kỹ thuật. Các {}cú pháp là ngắn hơn, gọn gàng hơn (ít Java-ish), và cho phép bạn ngay lập tức cư inline đối tượng - như sau:

var myObject = {
        title:  'Frog',
        url:    '/img/picture.jpg',
        width:  300,
        height: 200
      };

Mảng

Đối với mảng, gần như không có lợi ích gì khi sử dụng new Array();hơn [];- với một ngoại lệ nhỏ:

var emptyArray = new Array(100);

tạo một mảng dài 100 mục với tất cả các vị trí chứa undefined- có thể tốt / hữu ích trong các tình huống nhất định (chẳng hạn như (new Array(9)).join('Na-Na ') + 'Batman!').

Đề nghị của tôi

  1. Không bao giờ sử dụng new Object();- nó cứng hơn {};và trông ngớ ngẩn.
  2. Luôn luôn sử dụng [];- ngoại trừ khi bạn cần nhanh chóng tạo một mảng "trống" với độ dài được xác định trước.

22
Ngay cả khi bạn sử dụng cú pháp Mảng (100), cùng một mảng đó, ở vị trí thứ 101 vẫn chưa được xác định trong đó; điều duy nhất mà con số thực sự làm là thay đổi giá trị của thuộc tính độ dài.
Jason Bunting

6
@Pablo không có gì không hợp lệ về new Array(100). Đọc tài liệu: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/
Kẻ

9
@Pablo Tôi không biết đối số của bạn là gì. Giống như Douglas Crockford, tôi khuyên bạn nên sử dụng []. Không có tranh luận ở đó. Bạn, tuy nhiên, lập luận rằng new Array(100)bằng cách nào đó "không hợp lệ", đó là không đúng sự thật.
Már rlygieson

10
Ngoài ra, cần lưu ý rằng new Array(1,2,3)kết quả trong [1,2,3], nhưng new Array(1)không không gây ra [1]; do đó, ngữ nghĩa của Arraykhông nhất quán và khó hiểu không cần thiết.
Dancrumb

3
Tôi thêm rằng Object.create(null)có thể hữu ích cho việc tạo một đối tượng trống, trong khi { }kế thừa từ nguyên mẫu Object.
Meow

90

Vâng, có một sự khác biệt, chúng không giống nhau. Đúng là bạn sẽ nhận được kết quả tương tự nhưng động cơ hoạt động theo một cách khác cho cả hai. Một trong số đó là một đối tượng theo nghĩa đen và một trong số đó là một hàm tạo, hai cách khác nhau để tạo một đối tượng trong javascript.

var objectA = {} //This is an object literal

var objectB = new Object() //This is the object constructor

Trong JS, mọi thứ đều là một đối tượng, nhưng bạn nên biết về điều sau đây với Object () mới: Nó có thể nhận một tham số và tùy thuộc vào tham số đó, nó sẽ tạo ra một chuỗi, một số hoặc chỉ một đối tượng trống.

Ví dụ : new Object(1), sẽ trả về một Số. new Object("hello")sẽ trả về một chuỗi, điều đó có nghĩa là hàm tạo đối tượng có thể ủy quyền - phụ thuộc vào tham số - việc tạo đối tượng cho các hàm tạo khác như chuỗi, số, v.v ... Điều quan trọng là phải ghi nhớ điều này khi bạn quản lý dữ liệu động tạo đối tượng ..

Nhiều tác giả khuyên không nên sử dụng hàm tạo đối tượng khi bạn có thể sử dụng một ký hiệu theo nghĩa đen nhất định, nơi bạn sẽ chắc chắn rằng những gì bạn đang tạo là những gì bạn mong muốn có trong mã của mình.

Tôi đề nghị bạn nên đọc thêm về sự khác biệt giữa ký hiệu chữ và hàm tạo trên javascript để tìm thêm chi tiết.


Ký hiệu nghĩa đen trên thực tế dễ đọc và súc tích hơn để tạo các đối tượng dữ liệu động.
Sid

12

Các kết quả này có cùng kết quả cuối cùng, nhưng tôi chỉ đơn giản là thêm rằng sử dụng cú pháp bằng chữ có thể giúp người ta quen với cú pháp của JSON (một tập hợp con của chuỗi cú pháp đối tượng bằng chữ JavaScript), vì vậy có thể là một cách thực hành tốt .

Một điều khác: bạn có thể có lỗi tinh vi nếu bạn quên sử dụng newtoán tử. Vì vậy, sử dụng chữ sẽ giúp bạn tránh được vấn đề đó.

Cuối cùng, nó sẽ phụ thuộc vào tình hình cũng như sở thích.


8

Cú pháp bằng chữ và đối tượng {} / [] đã được giới thiệu trong JavaScript 1.2, do đó không có sẵn (và sẽ tạo ra lỗi cú pháp) trong các phiên bản của Netscape Navigator trước 4.0.

Những ngón tay của tôi vẫn mặc định nói Array mới (), nhưng tôi là một người rất già. Rất may, Netscape 3 không phải là một trình duyệt mà nhiều người phải xem xét ngày hôm nay ...


11
Netscape 3? Man, đó là trong thế kỷ trước ! :-D
Tomalak

8
var objectA = {}

nhanh hơn rất nhiều và theo kinh nghiệm của tôi, được sử dụng phổ biến hơn, vì vậy có lẽ tốt nhất là áp dụng 'tiêu chuẩn' và lưu một số cách gõ.


1
Nhanh hơn để chạy hoặc chỉ nhanh hơn để gõ?
hà mã

Chà, thừa nhận, tôi có nghĩa là "gõ" nhưng, được cho thêm thời gian phân tích cú pháp, có lẽ cũng rất khôn ngoan khi thực hiện nhanh hơn một chút :-)
Bobby Jack

2
Hơn nữa, nghĩa đen thường được tạo ra tại thời điểm phân tích, trong khi new Objectphải được thực thi trong thời gian chạy.
Phrogz

8

Tôi tin rằng {}đã được đề xuất trong một trong những vids Javascript ở đây như là một quy ước mã hóa tốt. newlà cần thiết cho thừa kế giả cổ điển. các var obj = {};cách giúp nhắc nhở bạn rằng đây không phải là một hướng đối tượng ngôn ngữ cổ điển nhưng một nguyên chủng. Do đó, thời gian duy nhất bạn thực sự cần newlà khi bạn đang sử dụng các hàm tạo. Ví dụ:

var Mammal = function (name) {
  this.name = name;
};

Mammal.prototype.get_name = function () {
  return this.name;
}

Mammal.prototype.says = function() {
  return this.saying || '';
}

Sau đó, nó được sử dụng như vậy:

var aMammal = new Mammal('Me warm-blooded');
var name = aMammal.get_name();

Một lợi thế khác khi sử dụng ngược {}lại new Objectlà bạn có thể sử dụng nó để thực hiện các đối tượng theo kiểu JSON.


7

Hiệu suất khởi tạo mảng

Nếu bạn muốn tạo một mảng không có độ dài:

var arr = []; nhanh hơn var arr = new Array();

Nếu bạn muốn tạo một mảng trống với độ dài nhất định:

var arr = new Array(x);nhanh hơn var arr = []; arr[x-1] = undefined;

Để biết điểm chuẩn, nhấp vào đây: https://jsfiddle.net/basickarl/ktbbry5b/

Tuy nhiên tôi không biết dấu chân của cả hai, tôi có thể tưởng tượng rằng nó new Array()chiếm nhiều không gian hơn.


arr = new Array(x)tương đương với arr = []; arr.length = x;, không gán x-1chỉ số với undefined.
Bergi

2

Đây thực chất là điều tương tự. Sử dụng bất cứ điều gì bạn thấy thuận tiện hơn.


Có lẽ tôi đang đào sâu quá nhiều vào javascript ở đây, nhưng chúng có giống nhau không? Không phải {proto} của Objectlà null, trong khi {proto} của {}là 'Object.prototype'?
Izhaki

@Izhaki Nguyên mẫu Objectlà null, đúng vậy. Đó là bởi vì Objectchấm dứt chuỗi nguyên mẫu. Object trường tuy nhiên không có một nguyên mẫu, chỉ có nhà xây dựng có một. Và (new Object()).constructor === ({}).constructor->true
Tomalak

Vậy điều này là không chính xác?
Izhaki

Đây là quan điểm của tôi: new Object()mang lại một đối tượng Object trống. {}mang lại một thể hiện đối tượng trống. Cả hai trường hợp này là hoàn toàn không thể phân biệt. Ví dụ bạn liên kết để làm một cái gì đó khác (nó sửa đổi chuỗi nguyên mẫu) và không thực sự áp dụng ở đây - hoặc tôi không hiểu lập luận của bạn.
Tomalak

1

OK , chỉ có 2 cách khác nhau để làm điều tương tự! Một người được gọi object literalvà người còn lại là một chức năng constructor!

Nhưng hãy đọc tiếp, có một vài điều tôi muốn chia sẻ:

Việc sử dụng {}làm cho mã của bạn dễ đọc hơn, trong khi tạo các phiên bản Objecthoặc các hàm tích hợp khác không được đề xuất ...

Ngoài ra, hàm Object lấy tham số là một hàm, như Object(params)... nhưng {}là cách thuần túy để bắt đầu một đối tượng trong JavaScript ...

Sử dụng đối tượng theo nghĩa đen làm cho mã của bạn trông gọn gàng và dễ đọc hơn đối với các nhà phát triển khác và nó phù hợp với các thực tiễn tốt nhất trong JavaScript ...

Mặc dù Object trong Javascript có thể là hầu hết mọi thứ, {}chỉ trỏ đến các đối tượng javascript, để kiểm tra cách thức hoạt động của nó, hãy thực hiện bên dưới trong mã javascript hoặc bảng điều khiển của bạn:

var n = new Object(1); //Number {[[PrimitiveValue]]: 1}

Đáng ngạc nhiên, nó đang tạo ra một số!

var a = new Object([1,2,3]); //[1, 2, 3]

Và điều này đang tạo ra một mảng!

var s = new Object('alireza'); //String {0: "a", 1: "l", 2: "i", 3: "r", 4: "e", 5: "z", 6: "a", length: 7, [[PrimitiveValue]]: "alireza"}

và kết quả kỳ lạ này cho String!

Vì vậy, nếu bạn đang tạo một đối tượng, bạn nên sử dụng đối tượng theo nghĩa đen, để có mã tiêu chuẩn và tránh bất kỳ tai nạn mã nào như trên, sử dụng hiệu quả khôn ngoan {}là tốt hơn theo kinh nghiệm của tôi!


bạn là Dezfooli? ở Iran?
Ehsan

Xin chào Ehsan, vâng, nhưng tôi không sống ở Iran mate, bạn có một hồ sơ tuyệt vời ở đây! Rất vui được gặp bạn ...
Alireza

Tôi có thể lưu số điện thoại của bạn và nhận trợ giúp từ bạn về lập trình không?
Ehsan

Tôi thấy bạn sử dụng telegram.
Ehsan

Vâng, chắc chắn, chúng tôi có thể chia sẻ một số kiến ​​thức về telegram cho chắc chắn! ___
Alireza
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.