2014-04-11 12 views
6

Tôi đang sử dụng moment.js trong một dự án hiện tại và tôi thấy rằng các toán tử so sánh <,>,> =, < = hoạt động chính xác. Tuy nhiên == thì không.MomentJS hoạt động như thế nào so sánh các giá trị với> và < (and > =, <=)?

Điều làm tôi ngạc nhiên là những tác phẩm này và bạn không cần sử dụng các hàm .isBefore() và .isAfter().

Có ai có thể cho tôi mô tả ngắn gọn về lý do tại sao các tác phẩm này không? Nó sẽ có thể làm cho == làm việc là tốt?

Cảm ơn.

+0

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

+0

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

Trả lời

8

Đ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.

4

Phép thuật là ValueOf(). JavaScript gọi phương thức valueOf() để chuyển đổi một đối tượng thành một giá trị nguyên thủy khi so sánh. Đối tượng Moment phương thức overrides valueOf() về cơ bản trả về giá trị valueOf() của đối tượng Date gốc bên dưới, trả về số epoch.

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