2009-07-17 44 views
46

Trong Javascript, sự khác biệt giữa một đối tượng và một băm là gì? Làm thế nào để bạn tạo ra cái này so với cái kia, và tại sao bạn lại quan tâm? Có sự khác biệt giữa các ví dụ mã sau không?Sự khác biệt giữa một đối tượng và một băm?

var kid = { 
name: "juni", 
age: 1 
} 

Và:

var kid = new Object(); 
kid.name = "juni"; 
kid.age = 1; 

Và:

var kid = new Object(); 
kid["name"] = "juni"; 
kid["age"] = 1; 

Bạn có thể nghĩ ra bất kỳ mã ví dụ khác tôi nên minh họa?

Câu hỏi chính về ở đâysự khác biệt giữa đối tượng và giá trị băm là gì?

+1

Tôi nghĩ rằng tuyên bố của bạn "chênh lệch giữa và đối tượng và một băm" có nghĩa là để có nghĩa là "sự khác biệt giữa và đối tượng và một (băm)bản đồ". – Peter

+0

điểm tốt ... nhưng không phải là Hash một loại Javascript thực tế? –

+7

Không có thứ gì như kiểu băm trong JavaScript. '{}' chỉ là một trình khởi tạo ngắn tay cho kiểu 'Object'. Và '[]' chỉ là một bộ khởi tạo ngắn tay cho kiểu 'Array'. – Blixt

Trả lời

48

Chỉ có không phải là bất kỳ. Cả ba thứ đó đều bằng nhau.

+14

Sai, hoặc đơn giản hóa quá ít. Nó không phải là có "không có sự khác biệt giữa chúng"; họ thực sự là tất cả những điều tương tự như vậy số tiền của sự khác biệt không phải là '0', nhưng' NaN'. –

+1

Chưa hết ... ở đây http://stackoverflow.com/questions/8511281/check-if-a-variable-is-an-object-in-javascript chúng cho thấy nhiều triển khai 'isObject' khác nhau _could_ đưa ra các câu trả lời khác nhau. –

3

Chúng giống nhau.

bạn có thể sử dụng chúng thay thế cho nhau.

4

Không có bất kỳ sự khác biệt nào trong bất kỳ mẫu nào của bạn. Chúng là tất cả các đối tượng có thuộc tính được đặt tên. Bạn vừa trình bày các cách khác nhau để tạo/tham chiếu các thuộc tính đó.

3

Tôi nghĩ rằng điều này là như nhau. Phiên bản thứ ba có thể được sử dụng với tên thuộc tính động. Người đầu tiên viết ngắn nhất.

13

Chúng là các hệ thống ký hiệu khác nhau mà bạn có thể sử dụng thay thế cho nhau. Có nhiều trường hợp khi sử dụng cú pháp khung [ ] có thể hấp dẫn hơn, ví dụ sẽ là khi tham chiếu một đối tượng có biến.

var temp = "kid"; 
var obj = new Object(); 
obj[temp] = 5; // this is legal, and is equivalent to object.kid 
obj.temp = 5; // this references literally, object.temp 
2

Chúng giống nhau. Cũng giống như []new Array() giống nhau.

Để biết thêm thông tin về các loại lõi chính của JavaScript, hãy xem MDC Core JavaScript 1.5 reference.

Nếu bạn muốn chứng minh rằng {} cũng giống như new Object():

Object.prototype.helloWorld = function() { alert('Foo!'); }; 
var a = new Object(); 
var b = {}; 
a.helloWorld(); 
b.helloWorld(); 

!!! CẢNH BÁO ACHTUNG AVERTISSEMENT !!! Không bao giờ, gán cho thuộc tính prototype của loại Object trong mã sản xuất. Bạn sẽ gây ô nhiễm toàn bộ không gian tên toàn cầu.

0

Thực ra, không có gì được gọi là 'hashtable' hoặc 'hashmap' trong JavaScript. Đối tượng trong JavaScript hoạt động giống như một 'băm' [đối tượng trong JavaScript đơn giản là các thuộc tính khóa/giá trị] và do đó sự nhầm lẫn.

4

Thực ra, mọi đối tượng trong JavaScript là một hàm băm. Đây là một băm thuộc tính và phương thức của đối tượng. Trong thực tế, mọi thứ trong Javascript là một băm (tức là một danh sách các cặp tên/giá trị).

Mỗi khi bạn gọi phương thức của đối tượng, thuộc tính hoặc chỉ tham chiếu bất kỳ biến nào, bạn thực hiện tra cứu băm nội bộ.

+0

Để súc tích, đó là một bản đồ tổng quát thay vì một băm mà mọi đối tượng trong JavaScript là. Trong các ngôn ngữ như Java, C# và vv, bản đồ được sử dụng cho loại dữ liệu đồng nhất, trong khi trong JavaScript, dữ liệu cho '' map'' chỉ là không đồng nhất. – lcn

5

Trong các ngôn ngữ khác như Java và C#, có thể sử dụng bất kỳ đối tượng nào (không chỉ là chuỗi hoặc số) làm khóa trong bảng băm/bản đồ băm, không phải là trường hợp trong JavaScript: thành chuỗi.

var h = {}, k = {}; 
h[k] = "One"; 
alert(h[ "[object Object]" ]); // Alerts "One" 

Có thể hữu ích khi sử dụng các đối tượng tùy ý làm khóa, trong trường hợp này bạn có thể sử dụng một thứ như jshashtable.

Tuyên bố từ chối trách nhiệm: Tôi đã viết jshashtable.

1

Về mặt kỹ thuật, chúng giống nhau. Khi bạn viết mã, bạn có thể dễ dàng thực hiện myobject['someproprty' + 'somethingElseConcatenated] mà bạn không thể thực hiện khi sử dụng "ký hiệu chấm" - myobject.someproperty là tất cả những gì bạn có thể làm.

Douglas Crockford, một trong các autors của ECMAscript, đề xuất không sử dụng cú pháp var a = new Object() vì một lý do nào đó mà tôi không nắm bắt được. Dù sao, đáng xem bản trình bày của anh ấy nếu bạn quan tâm đến nó (nó bao gồm nhiều phần, phần đầu tiên là ở đây http://video.yahoo.com/watch/111593/1710507)

1

Mọi động cơ (trình duyệt) thực hiện khác nhau nhưng hãy tập trung vào V8 của chrome (dựa trên hiệu suất) các thử nghiệm tôi đã thực hiện một năm trước trên hầu hết các trình duyệt hiện đại, chúng cung cấp tăng hiệu suất tương tự nếu bạn thực hiện theo các hướng dẫn v8).

gì nó về cơ bản xảy ra là:

  1. Thực hiện một đối tượng năng động mà thuộc tính có thể được thêm vào và xóa một cách nhanh chóng - một Hashtable là giải pháp đơn giản nhất - nhưng Speedwise nó không hiệu quả như một đối tượng thường xuyên trong java (truy cập ngẫu nhiên ...).
  2. Những gì V8 làm là cố gắng đoán dựa trên vài chiến lược nếu đối tượng của bạn là đối tượng thường xuyên (có tập hợp thuộc tính cuối cùng được đặt theo thứ tự cụ thể, v.v.) hoặc có thể bắt đầu bằng. Lúc đầu, nó giả định đây là một đối tượng đơn giản và mỗi thuộc tính mới tạo ra một cấu trúc mới của một đối tượng và sao chép một đối tượng cũ trên nó cộng với thuộc tính mới. Nếu đối tượng được phân loại là "khó" - nó được chuyển đến một hushtable.
  3. Nếu v8 nhận thấy quá nhiều "lỗi" - nó sẽ chuyển mọi thứ thành hashtables - do đó bạn có hiệu suất kém (đó là lý do tại sao bạn muốn sử dụng các nhà thầu khởi tạo tất cả các thành viên hoặc cấu trúc của bạn trong ...)

Xin xem liên kết này: https://developers.google.com/v8/design#prop_access

www.quora.com/Are-JavaScript-Objects-implemented-as-HashTables-Is-key-value-access-O-1

jayconrod.com/bài đăng/52/a-tour-of-v8-đối tượng-đại diện

Cũng là một bài giảng rất tốt: https://www.youtube.com/watch?v=UJPdhx5zTaw

Hy vọng nó sẽ giúp ...

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