Hàm isNaN tích hợp sẵn của JavaScript , theo mặc định - như được mong đợi - một "Toán tử kiểu động". Do đó, tất cả các giá trị (trong quá trình DTC) có thể mang lại một giá trị đúng đơn giản | sai như , không thể là NaN."", " ", " 000"
Có nghĩa là đối số được cung cấp trước tiên sẽ trải qua chuyển đổi như trong:
function isNaNDemo(arg){
var x = new Number(arg).valueOf();
return x != x;
}
Giải trình:
Trong dòng trên cùng của thân hàm, chúng tôi (đầu tiên) đang cố gắng chuyển đổi thành công đối số thành một đối tượng số. Và (thứ hai), sử dụng dot điều hành chúng tôi - để thuận tiện của chúng ta - ngay lập tức tước, các nguyên giá trị của đối tượng được tạo ra.
Trong dòng thứ hai, chúng ta đang lấy giá trị thu được ở bước trước và lợi thế của thực tế là NaN không bằng bất cứ thứ gì trong vũ trụ, thậm chí không phải là chính nó, ví dụ: NaN == NaN >> false
để cuối cùng so sánh nó (về sự bất bình đẳng) với chính nó .
Theo cách này, hàm trả về sẽ chỉ mang lại đúng khi và chỉ khi, trả về đối số được cung cấp, là một nỗ lực chuyển đổi không thành đối tượng số, tức là số không phải là số; ví dụ: NaN.
isNaNstatic ()
Tuy nhiên, đối với Toán tử loại tĩnh - nếu cần và khi cần - chúng ta có thể viết một hàm đơn giản hơn nhiều như:
function isNaNstatic(x){
return x != x;
}
Và tránh DTC hoàn toàn để nếu đối số không rõ ràng là số NaN, nó sẽ trả về sai. Vì vậy, thử nghiệm đối với những điều sau đây:
isNaNStatic(" x"); // will return false
bởi vì nó vẫn là một chuỗi
Tuy nhiên:
isNaNStatic(1/"x"); // will of course return true.
như sẽ chẳng hạn isNaNStatic(NaN); >> true
.
Nhưng ngược lại isNaN
, isNaNStatic("NaN"); >> false
bởi vì nó (đối số) là một chuỗi bình thường.
ps: Phiên bản tĩnh của isNaN có thể rất hữu ích trong các kịch bản mã hóa hiện đại. Và nó rất có thể là một trong những lý do chính khiến tôi mất thời gian để đăng bài này.
Trân trọng.