2011-09-12 30 views
6

Tôi vừa mới được nhìn vào _.isEqual chức năng của Underscore.js và một phần của mã đi một cái gì đó như thế này:Đây có phải là dòng từ Underscore.js thực hiện kiểm tra bình đẳng thực sự cần thiết không?

if (a === b) return true; 

if (typeof a !== typeof b) return false; 

if (a == b) return true; 

Tôi chỉ tự hỏi nếu có bất kỳ trường hợp báo cáo kết quả thứ ba có thể đạt được và đánh giá là true?

Chỉnh sửa: Chỉ cần rõ ràng, đây không phải là mã của riêng tôi Tôi đang nói về, tôi đang đọc nguồn gốc của Underscore, cụ thể là this line và tôi đã tò mò về lý do tại sao họ làm điều đó.

+1

Phải có một số trường hợp cạnh kỳ lạ, nơi điều này là có thể ... –

+0

@nickf: Xem xét rằng '==' và '===' giống hệt nhau khi các kiểu giống nhau, tôi không thể thấy các thử nghiệm đầu tiên và thứ ba bao giờ sẽ cung cấp kết quả khác nhau như thế nào. Ngay cả trong trường hợp 'null' trong đó' typeof' khác với 'Type' nội bộ, nó không ép buộc bất kỳ giá trị nào ngoại trừ' undefined', có giá trị 'typeof' khác. Và nếu có * là * một số trường hợp cạnh ra khỏi đó, làm thế nào để bạn biết rằng bạn muốn * muốn * nó để ép buộc? Có vẻ lạ khi có một '==' và một '===' kiểm tra các giá trị giống nhau. Hoặc là bạn muốn ép buộc loại hoặc bạn không muốn. – user113716

+0

... Tôi nên làm rõ rằng bằng * "bạn" * trong nhận xét ở trên, tôi không ngụ ý ngụ ý * nickf *, mà đúng hơn là * một người *. – user113716

Trả lời

3

Tôi vừa duyệt qua kho lưu trữ Underscore và gặp một cuộc thảo luận ngắn khi có người hỏi the exact same thing và có vẻ như nó thực sự không cần thiết.

Làm theo thuật toán được xác định bởi Đặc tả ngôn ngữ ECMAScript trong section 11.9.6section 11.9.3 dường như cho thấy rằng không có cặp giá trị nào trả về đúng trong trường hợp trên.

Vì vậy, trong ngắn hạn, không, tình huống đó là không thể.

+0

+1 Tìm kiếm tốt trên cuộc thảo luận đó – user113716

1

Tình hình duy nhất mà ===== phản ứng bất ngờ là khi so sánh một chuỗi chữ ("123") thành một chuỗi xây dựng (new String("123")), trong đó sẽ thất bại thử nghiệm đầu tiên.

Tuy nhiên, trong lần kiểm tra thứ hai nó bị bắt vì chuỗi được tạo có loại object, nhưng chữ có loại string.

Dựa trên điều đó, tôi muốn nói không, tuyên bố thứ ba không bao giờ có thể đạt được và đánh giá đúng.

1

Khi bạn sử dụng toán tử == và các biểu thức có nhiều loại khác nhau, JavaScript nói chung sẽ chuyển đổi hai loại thành cùng loại trước khi so sánh.

Ví dụ: điều này có thể xảy ra với nullundefined. null == undefined là đúng, mặc dù null === undefined là sai. Tuy nhiên typeof null"object", trong khi typeof undefined"undefined". Vì vậy, trong trường hợp này bạn nên trả về false trên câu lệnh thứ hai.

Bạn có thể đọc tất cả các chi tiết trong spec (phần 11.9.3), nó là rất quan: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

1

đoán ban đầu của tôi là nó là để làm việc xung quanh việc thực hiện trình duyệt bị hỏng.

Tuy nhiên sau khi đào sâu vào nhật ký git cho tệp đó, có vẻ như dòng tương ứng nằm trong lần kiểm tra đầu tiên underscore.js. (Tôi sẽ không truy tìm tài liệu gốc của phụ huynh core.js repo ...) Bạn có thể xem nó tại dòng 334 của https://github.com/documentcloud/underscore/commit/02ede85b539a89a44a71ce098f09a9553a3a6890.

Vì vậy, bây giờ tôi đoán là nó chỉ cruft mà còn lại trong, không bao giờ hoàn toàn kiểm tra và không bao giờ làm sạch.

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