2010-05-22 56 views
11

Tại sao toán tử bình đẳng trả về false trong trường hợp đầu tiên?So sánh ngày JavaScript

var a = new Date(2010, 10, 10); 
var b = new Date(2010, 10, 10); 
alert(a == b); // <- returns false 
alert(a.getTime() == b.getTime()); // returns true 

Tại sao?

Trả lời

28

Kể từ ngày được tích hợp trong các đối tượng, và không phải primitives, kiểm tra bình đẳng được thực hiện bằng cách sử dụng các tham chiếu đối tượng.

Trong trường hợp này, đối tượng ab không phải là cùng một đối tượng và do đó thử nghiệm không thành công.
Bạn có thể xem tương tự sử dụng

var a = new String("a"); 
var b = new String("a"); 
alert(a == b); //false 

Bằng cách sử dụng .getTime hoặc .valueOf bạn đang chuyển đổi giá trị các đối tượng vào một nguyên thủy, và chúng được luôn so sánh bằng giá trị chứ không phải là bằng cách tham khảo.

Nếu bạn muốn làm một so sánh theo giá trị của hai thời điểm đó cũng là một cách mơ hồ hơn để làm điều này

var a = new Date(2010, 10, 10); 
var b = new Date(2010, 10, 10); 

alert(+a == +b); //true 

Trong trường hợp này + hành unary buộc động cơ javascript để gọi các đối tượng valueOf phương pháp - và vì vậy nó là hai nguyên thủy đang được so sánh.

+0

Đây là một hack thú vị, cảm ơn bạn! – Art

+0

Không chắc chắn tôi muốn gọi nó là một hack thực sự. –

+0

Chỉ để chắc chắn - tôi đang đề cập đến câu lệnh "+ a == + b". – Art

0

Compare two dates with JavaScript

dates.compare (a, b)

Thực tế là sự so sánh giữa hai đối tượng không hoạt động đúng:/

+0

Không thực sự. Sự so sánh giữa hai đối tượng hoạt động như được chỉ định. –

0

Nếu bạn tạo hai đồng hồ và đặt đồng thời cả hai đồng hồ, bạn có hai đồng hồ.

Nếu bạn thay đổi thời gian trong một đồng hồ, nó sẽ không thay đổi thời gian trong đồng hồ khác.

Để so sánh hoặc sắp xếp Ngày, hãy trừ cái kia với nhau. Giá trị của đối tượng Date, được sử dụng trong biểu thức toán học, là dấu thời gian của nó.

chức năng compareDates (a, b) {return a-b};

-1

Tôi xin lỗi các bạn, nhưng điều này là ngu ngốc ... đặc biệt là đôi chút về việc có hai đồng hồ.

==, theo định nghĩa so sánh VALUES, trong khi === so sánh tham chiếu. Nói rằng == thất bại cho các nguyên thủy không phá vỡ cấu trúc cú pháp của chính ngôn ngữ đó. Tất nhiên, === sẽ thất bại trong ví dụ ban đầu, vì hai ngày rõ ràng là hai con trỏ riêng biệt với hai không gian bộ nhớ riêng biệt, nhưng, theo định nghĩa của đặc tả JS, == sẽ trả về TRUE để so sánh hai ngày có giá trị là cùng một điểm trong thời gian.

Tuy nhiên, một lý do khác khiến tôi ghét JS ...

Xin lỗi vì đã rên rỉ, nhưng điều này chỉ đá mông của tôi trong một giờ.

Là một sang một bên, bạn có thể sử dụng valueOf() để so sánh các giá trị, và điều đó sẽ trả về true ... nó thừa với == nhưng nó hoạt động.

+0

đồng ý, chẳng hạn một WTF – Art

+1

Bạn không biết những gì bạn đang ranting về ... Sự khác biệt giữa == và === có không có gì để làm với các giá trị vs refs, == chỉ đơn giản nói rằng VM nên sử dụng một tập hợp các quy tắc coking được xác định rõ ràng khi hai toán hạng có các kiểu khác nhau, trong khi === nói rằng không có sự ép buộc nào xảy ra. –