2014-09-07 22 views
5

Làm thế nào điều này có thể sai?NaN! == parseInt (không xác định);

console.log(parseInt(undefined)); 
//NaN 
console.log(parseInt(undefined)===NaN); 
//false 

Đó dường như câm

+2

Hãy thử 'console.log (NaN === NaN)' – SLaks

Trả lời

7

NaNkhông bằng bất cứ điều gì, ngay cả bản thân. Sử dụng isNaN để phát hiện NaN thay vì bình đẳng.

NaN === NaN // -> false 
isNaN(NaN) // -> true (argument is coerced [ToNumber] as required) 
x = NaN 
x !== x  // -> true (would be false for any other value of x) 
NaN || "Hi" // -> "Hi" (NaN is a false-y value, but not false) 

Đây là một kết quả của JavaScript sau IEEE-754 và nó (yên tĩnh) NaN lack-of-ordering behavior:

Một so sánh với một NaN luôn trả về một thứ tự [không bằng] kết quả ngay cả khi so sánh với chính nó.

Xem thêm What is the rationale for all comparisons returning false for IEEE754 NaN values?

+1

là một phần của vật lý lượng tử? – 8DK

+0

Vì vậy, đây là hành vi mong đợi! Điều đó giải thích lý do tại sao tôi đã không nhận thấy nó trong tất cả các [wtf] (http://wtfjs.com/) [javascript] (https://www.destroyallsoftware.com/talks/wat) nội dung tôi đã xem. – iabw

+0

@iabw Vâng, dự kiến. Tôi nghĩ rằng đó là một kiểm tra trực tiếp đi lên khá thường xuyên. Hầu hết mã có khả năng ép buộc kết quả của một parseInt như 0 hoặc coi 0/false-y là không hợp lệ (vì NaN vẫn là giá trị flase-y). Ngoài ra, hành vi NaN này sẽ không (không nên) khiến mọi người ngạc nhiên với nền bằng các ngôn ngữ khác sử dụng các loại điểm nổi tương tự, hầu hết trong số đó. – user2864740

2

của nó vì NaN === NaN cũng là sai!

3

NaN không bằng bản thân và lý do có thể được hiểu từ câu trả lời đăng bởi Stephen here:

hiểu biết của tôi từ nói chuyện với Kahan là NaN = NaN có nguồn gốc ra khỏi hai cân nhắc thực tế:

  • rằng x == y nên tương đương với x - y == 0 bất cứ khi nào có thể (không chỉ là một định lý số học thực tế, điều này làm cho phần cứng thi hành compar ison hiệu quả về mặt không gian, tối đa là tầm quan trọng tại thời điểm tiêu chuẩn được phát triển - tuy nhiên, chú ý, rằng điều này bị vi phạm vì x = y = vô cùng, do đó không phải là lý do chính đáng. nó có thể được uốn cong hợp lý để x - y == 0 or NaN).

  • quan trọng hơn, không có vị ngữ isnan() tại thời điểm NaN được chính thức hóa trong số học 8087; cần phải cung cấp cho các lập trình viên một phương tiện tiện lợi và hiệu quả để phát hiện các giá trị NaN không phụ thuộc vào ngôn ngữ lập trình cung cấp một cái gì đó như isnan() có thể mất nhiều năm. Tôi sẽ báo giá viết riêng Kahan về đề tài này:

Were không có cách nào để thoát khỏi Nans, họ sẽ là vô dụng như Indefinites trên CRAYs; ngay sau khi gặp phải, việc tính toán sẽ được dừng lại tốt nhất thay vì tiếp tục trong một thời gian vô hạn tới một kết luận không xác định. Đó là lý do tại sao một số hoạt động khi NaN phải cung cấp kết quả không phải là NaN. Những hoạt động nào? … Các ngoại lệ là C các biến vị ngữ “x == x” và “x! = X”, tương ứng là 1 và 0 cho mọi số vô hạn hoặc hữu hạn x nhưng ngược lại nếu x không phải là số (NaN); chúng cung cấp sự phân biệt đơn giản chưa từng có trước đây giữa các số NaN và các số trong các ngôn ngữ thiếu từ cho NaN và một vị từ IsNaN (x).

Lưu ý rằng đây cũng là logic quy tắc trả lại nội dung như “Không phải A-Boolean”. Có lẽ chủ nghĩa thực dụng này đã bị đặt sai chỗ, và tiêu chuẩn phải có yêu cầu isnan(), nhưng điều đó có thể đã làm cho NaN gần như không thể sử dụng hiệu quả và thuận tiện cho một số năm trong khi thế giới chờ chấp nhận ngôn ngữ lập trình. Tôi là không được thuyết phục rằng đó có thể là một sự cân bằng hợp lý.

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