2013-05-21 37 views
8

Mọi thứ trong JS là một đối tượng. Tôi luôn biết điều đó, và tôi hoàn toàn hiểu điều đó. Tôi biết lý do tại sao {} !== {}. Đó là hai đối tượng khác nhau. Giống như bạn đã viết ra new Object() == new Object().Trong JavaScript, tại sao không có bất kỳ đối tượng nào bằng nhau, ngoại trừ chuỗi?

Một số ví dụ khác:

{} == {} // => false 
[] == [] // => false 
// ==// // => false 
new String() == new String() // => false 

Nhưng, Strings là những đối tượng quá (đó là lý do tại sao bạn có thể làm ''.replace() và mở rộng chúng), vậy tại sao không làm việc này:

'' == '' // => true 

Rõ ràng nó muốn là một nhức đầu rất lớn để so sánh hai chuỗi nếu điều này không làm việc, nhưng điều này có vẻ không phù hợp với phần còn lại của ngôn ngữ. Nội bộ, những gì đang xảy ra? Nó chỉ là một lần duy nhất hay có một số khái niệm khác đằng sau điều này?

+5

Hãy xem xét điều này: [Sự khác biệt giữa loại chuỗi javascript và đối tượng chuỗi?] (Http://stackoverflow.com/questions/2051833/difference-between-the-javascript-string-type-and-string- đối tượng) – Blender

+1

http://bclary.com/2004/11/07/#a-11.9.3 – moonshadow

+0

"Mọi thứ trong JS là một đối tượng" theo nghĩa là ngay cả chuỗi nguyên thủy "kế thừa" từ nguyên mẫu Chuỗi. Nhưng JS có các giá trị "nguyên thủy" không được so sánh như các đối tượng. Bạn có thể kiểm tra kiểu cơ bản này với toán tử 'typeof'. Và thông số cho '===': http://es5.github.io/#x11.9.6 –

Trả lời

4

Javascript cơ bản đối xử với chuỗi và số như vô hướng tại mọi thời điểm, chuyển đổi chúng sang đối tượng khi một phương pháp được gọi, và chuyển đổi trở lại sau đó, trong trường hợp bạn đang không rõ ràng tuyên bố new String("");

Cùng với những con số.

Nếu không có chuỗi/số/bình đẳng boolean, bạn sẽ gặp khó khăn khi làm bất cứ điều gì.

+0

"và chuyển đổi lại sau" không có gì được chuyển đổi trở lại. Đối tượng Wrapper chỉ bị vứt bỏ. – zerkms

+0

@zerkms Có. Bạn hoàn toàn đúng. Nhưng xét về ma thuật đằng sau màn, không ai thấy cái bao bọc ở nơi đầu tiên. Chuỗi là một nguyên thủy cho đến khi nó cần phải là một đối tượng, và sau đó nó là một đối tượng trong phạm vi của các cuộc gọi phương thức của nó, và sau đó nó là một nguyên thủy một lần nữa. Việc thực hiện thực tế tính năng này hoàn toàn khác với hành vi nhận thức (giống như '++ i' so với' i ++ '). – Norguard

+0

anyway, tôi sẽ không nói điều gì đó được chuyển đổi trở lại, chỉ vì nó không chính xác ;-) – zerkms

3

Đây là một lần duy nhất.

Reference

Có sự khác biệt giữa chuỗi ký tự và chuỗi ký tự. Bài viết sẽ đi vào chi tiết hơn nếu bạn quan tâm.

Điều này cũng đúng với các phép toán và số. Những nguyên thủy này được so sánh khác với các đối tượng.

0

Có năm loại nguyên thủy trong JavaScript: Số, Chuỗi, Boolean, Không xác định và Null. So sánh chuỗi trống có nghĩa là "" với chính nó không khác với so sánh 5 === 5.

+2

Không, nó không: http://f.cl.ly/items/3V3c0G3y0k1x2p1X0Q1Q/Screen%20Shot%202013-05-21%20at%204.54.47%20PM.png –

+0

Bắt tốt. Có vẻ như tôi đã trả lời quá nhanh, trước khi hiểu sự khác biệt giữa một chuỗi ký tự và một đối tượng chuỗi. Câu trả lời đã được chỉnh sửa là chính xác. –

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