Điều này là do cách comparison and equality operators trong công việc JavaScript (tôi nhấn mạnh):
Để so sánh trừu tượng quan hệ (ví dụ, < =), các toán hạng là đầu tiên chuyển thành nguyên thủy, sau đó đến cùng loại, trước khi so sánh.
[...]
Nhà điều hành bình đẳng chuyển đổi toán hạng nếu họ không của cùng loại, sau đó áp dụng so sánh nghiêm ngặt. Nếu toán hạng là một số hoặc boolean, toán hạng sẽ được chuyển thành số nếu có thể; nếu một trong hai toán hạng là một chuỗi, toán hạng chuỗi là được chuyển đổi thành một số nếu có thể. Nếu cả hai toán hạng đều là đối tượng, thì JavaScript so sánh tham chiếu nội bộ bằng nhau khi toán hạng tham chiếu cùng một đối tượng trong bộ nhớ.
Vì vậy, khi hai đối tượng thời điểm được so sánh với sự bất bình đẳng, chúng được chuyển đổi thành số. Đối với đối tượng Moment.js, đây là mili giây kể từ khi kỷ nguyên unix nửa đêm UTC, ngày 1 tháng 1 năm 1970.
Trong REPL console cửa sổ/nút trình duyệt yêu thích của bạn:
> +moment()
<- 1412332710977
Đối với việc kiểm tra ==
bình đẳng, thời gian chạy so sánh tham chiếu giữa hai đối tượng, trả về false
cho hai trường hợp thời điểm khác nhau, ngay cả khi cả hai đối tượng đều có cùng ngày/giờ.
Thiếu mặc định .equals()
hoặc operator==()
quá tải trong JavaScript khiến hành vi này khá trực quan, đặc biệt nếu bạn đến từ các ngôn ngữ khác.
Cũng lưu ý isBefore
/isAfter
chức năng của Moment có thực sự chậm, vì chúng sao chép cả thời điểm các đối tượng trong nội bộ trước khi thực hiện việc so sánh (điều này là bởi vì có một đối số tùy chọn để isBefore
/isAfter
để xác định thời gian thành phần để so sánh trên (ví dụ: 'hour'
) và nó nhái bất kể đối số này có hiện diện hay không).
Khoảnh khắc bị ở đây do có các đối tượng có thể thay đổi, đó là lý do tại sao nó đang thực hiện phòng thủ clone()
ngay từ đầu và sau đó tiếp tục không tối ưu hóa đường dẫn chung.
Bạn có thể cung cấp [jsfiddle] (http://jsfiddle.net) không? Ngoài ra vấn đề, tôi đoán, là do giá trị datetime. Kiểm tra điều này bằng cách sử dụng getTime() vào ngày và xem chúng có bằng nhau hay không. Nếu không, họ có thể so sánh phiên bản ngày thực tế thay vì giá trị được liên kết với ngày đó. Cuối cùng, hãy thử sử dụng 'moment(). IsSame()'. – Dom
bản sao có thể có của [vấn đề với biến ngày trong Javascript] (http://stackoverflow.com/questions/16873689/issue-with-date-variable-in-javascript) – Bergi