Chúng ta có một mảng các phần tử chứa cả giá trị true và false. Công việc của chúng ta là viết một hàm trả về một mảng có chỉ số của các phần tử đó là NaN trong mảng ban đầu.
NaN! ==NaN
Kiểu dữ liệu của NaN thực sự là số. Mặc dù NaN là một giá trị giả, nhưng nó có một đặc tính riêng mà không có kiểu dữ liệu hoặc biến nào khác có được. Đó là biểu thức NaN ===NaN sinh ra giá trị bằng nhau. Và chỉ trong trường hợp của NaN, điều đó là sai.
Vì vậy, chúng ta có thể sử dụng hành vi này cho mục đích tốt của mình và chọn ra chỉ số giá trị NaN. Mã cho ý chí này -
const arr = [7, 1, "123abc", undefined, NaN, 78, NaN, null, "aes", NaN, '', null, NaN]; const pickNaN = (arr) => { return arr.reduce((acc, val, ind) => { if(val !== val){ acc.push(ind); }; return acc; }, []); }; console.log(pickNaN(arr));
Sử dụng isNaN () / Number.isNaN ()
Hàm isNaN () trả về true hoặc false dựa trên thực tế là giá trị được cung cấp có phải là NaN hay có thể bị ép buộc thành NaN. Trong khi đó, hàm Number.isNaN () chỉ trả về true nếu giá trị được cung cấp thực sự là NaN.
Vì vậy, Number.isNaN () là một cách đáng tin cậy để kiểm tra NaN so với isNaN (). Sự khác biệt giữa các đầu ra mã được minh họa bên dưới.
Ví dụ
const arr = [7, 1, "abc", undefined, NaN, 78, NaN, null, "aes", NaN, '', null, NaN]; const pickNaN = (arr) => { return arr.reduce((acc, val, ind) => { if(Number.isNaN(val)){ acc.reliableWay.push(ind); }; if(isNaN(val)){ acc.unreliableWay.push(ind); } return acc; }, { reliableWay: [], unreliableWay: [] }); }; console.log(pickNaN(arr));
Mã này chuẩn bị hai mảng, một mảng sử dụng Number.isNaN () và một mảng sử dụng isNaN ().
Đầu ra
Đầu ra sẽ là -
{ reliableWay: [ 4, 6, 9, 12 ], unreliableWay: [ 2, 3, 4, 6, 8, 9, 12] }
Chúng ta có thể thấy rõ isNaN () đã tính toán nhiều giá trị không phải NaN như NaN như thế nào. Đó là lý do tại saoNumber.isNaN () là một cách đáng tin cậy hơn.