Sử dụng bất ngờ của isNaN


154

Tôi đang cố gắng sử dụng isNaNhàm toàn cầu bên trong hàm mũi tên trong mô-đun Node.js nhưng tôi gặp lỗi này:

[eslint] Unexpected use of 'isNaN'. (no-restricted-globals)

Đây là mã của tôi:

const isNumber = value => !isNaN(parseFloat(value));

module.exports = {
  isNumber,
};

Bất cứ ý tưởng về những gì tôi đang làm sai?

PS: Tôi đang sử dụng hướng dẫn kiểu AirBnB.

Câu trả lời:


282

Như tài liệu cho thấy , sử dụng Number.isNaN.

const isNumber = value => !Number.isNaN(Number(value));

Trích dẫn tài liệu của Airbnb:

Tại sao? IsNaN toàn cầu ép buộc các số không thành số, trả về giá trị true cho bất kỳ thứ gì ép buộc với NaN. Nếu hành vi này là mong muốn, làm cho nó rõ ràng.

// bad
isNaN('1.2'); // false
isNaN('1.2.3'); // true

// good
Number.isNaN('1.2.3'); // false
Number.isNaN(Number('1.2.3')); // true

28
Nhưng isNaNNumber.isNaNkhông phải là cùng chức năng. Chẳng hạn isNaN('1a') true Number.isNaN('1a') false
rosencreuz

3
@rosencreuz Giống như hành vi không mong muốn. Đó là lý do tại sao có Number('1.2.3')trong ví dụ trên.
Cổng thông tin Patrick

2
Thật là một quy tắc ngu ngốc, toàn bộ vấn đề là ép buộc một con số hoặc bạn cũng có thể chỉ cần typeofkiểm tra.
Đaminh

Tôi sử dụng Number.isNaN(+'1.2.3')chỉ là một phần phụ +nếu bạn sử dụngNumber.isNaN
Ibraheem

16

FYI, điều này sẽ không làm việc cho IE. Kiểm tra ở đây tại khả năng tương thích trình duyệt.


3

@Andy Gaskell isNumber('1.2.3')trở lại true, bạn có thể muốn chỉnh sửa câu trả lời của mình và sử dụng Number()thay choparseFloat()

    const isEmpty = value => typeof value === 'undefined' || value === null || value === false;
    const isNumeric = value => !isEmpty(value) && !Number.isNaN(Number(value));
  console.log(isNumeric('5')); // true
  console.log(isNumeric('-5')); // true
  console.log(isNumeric('5.5')); // true
  console.log(isNumeric('5.5.5')); // false
  console.log(isNumeric(null)); // false
  console.log(isNumeric(undefined)); // false

Tôi chỉ nhận thấy câu trả lời này ngay bây giờ. Câu trả lời của tôi đã được cập nhật, cảm ơn bạn!
Andy Gaskell

1

Trong trường hợp của tôi, tôi muốn coi 5 (số nguyên), 5,4 (thập phân), '5', '5,4' dưới dạng số nhưng chẳng có gì khác.

Nếu bạn có các yêu cầu tương tự, dưới đây có thể hoạt động tốt hơn:

const isNum = num => /^\d+$/.test(num) || /^\d+\.\d+$/.test(num);

//Check your variable if it is a number.
let myNum = 5;
console.log(isNum(myNum))

Để bao gồm số âm:

const isNum = num => /^-?\d+$/.test(num) || /^-?\d+\.\d+$/.test(num);

Điều này cũng sẽ loại bỏ vấn đề sử dụng isNaN toàn cầu của bạn. Nếu bạn chuyển đổi hàm isNum thành hàm ES5 bình thường, nó cũng sẽ hoạt động trên trình duyệt IE.


0

Đối với tôi điều này hoạt động tốt và không có vấn đề gì với ESlint

window.isNaN()


Sử dụng tiêu chuẩn AirBnb bạn sẽ nhận được: ESLint: 'window.isNaN' bị hạn chế sử dụng. Vui lòng sử dụng Number.isNaN thay thế (không giới hạn thuộc tính)
Bartek Maciejewski

@BartekMaciejewski Vấn đề với Number.isNaN là chúng không cùng chức năng. Ví dụ. Number.isNaN('abc')false. Và isNaN('abc')true
Yoannes Geissler

Có, tôi hoàn toàn đồng ý với bạn - chỉ muốn đề cập rằng việc sử dụng window.isNan()là trái với cấu hình khác của AirBnb (quy tắc là eslint.org/docs/rules/no-restricted-properies )
Bartek Maciejewski

@BartekMaciejewski Đây là một nỗi đau, tôi không may phải hủy kích hoạt no-restricted-propertiesvì vấn đề này
Yoannes Geissler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.