gõ kiểm tra trong javascript


76

Làm cách nào để kiểm tra xem một biến hiện có phải là kiểu số nguyên hay không? Tôi đã tìm kiếm một số loại tài nguyên cho điều này và tôi nghĩ toán tử === là quan trọng, nhưng tôi không chắc chắn về cách kiểm tra xem một biến có phải là Số nguyên (hay Mảng cho vấn đề đó)


9
== kiểm tra bình đẳng giá trị, === kiểm tra bình đẳng giá trị và kiểu. "1" == 1 sẽ là đúng, "1" === 1 sẽ là sai
Kai

bạn có thể cân nhắc sử dụng một thư viện rất nhỏ như Not . Giải quyết tất cả các vấn đề.
Calvintwr

Câu trả lời:


124

Một biến sẽ không bao giờ là một kiểu số nguyên trong JavaScript - nó không phân biệt giữa các loại Số khác nhau.

Bạn có thể kiểm tra xem biến có chứa một số hay không và nếu số đó là số nguyên.

(typeof foo === "number") && Math.floor(foo) === foo

Nếu biến có thể là một chuỗi chứa một số nguyên và bạn muốn xem liệu đó có phải là trường hợp hay không:

foo == parseInt(foo, 10)

2
bạn cũng có thể sử dụng isNaN (foo) w3schools.com/jsref/jsref_NaN.asp thay vì typeof
m4tt1mus

4
"nó không phân biệt giữa các loại Số khác nhau" Đó là bởi vì không có các loại Số khác nhau. Tất cả các giá trị số trong JS đều là float 64-bit.
NullUserException

1
@NullUserException - Đó là những gì tôi đã nói.
Quentin

Nếu bạn đang sử dụng jQuery, bạn có thể sử dụng hàm $ .type () của nó. Ví dụ. $ .type ("1") # => "string"
Andrei

2
Câu trả lời này nên được cập nhật vì nó không nhất quán với hàm Number.isInteger của ECMAScript 2015 . Nó sẽ trả về false cho Infinity , không phải true.
RobG

16

Những ngày này, ECMAScript 6 (ECMA-262) đang "ở trong nhà". Sử dụng Number.isInteger(x)để đặt câu hỏi bạn muốn hỏi liên quan đến loại x:

js> var x = 3
js> Number.isInteger(x)
true
js> var y = 3.1
js> Number.isInteger(y)
false

7

Một số là số nguyên nếu modulo% 1 của nó là 0-

function isInt(n){
    return (typeof n== 'number' && n%1== 0);
}

Điều này chỉ tốt như javascript get- say + - ten to the 15.

isInt(Math.pow(2,50)+.1)trả lại true, như vậy Math.pow(2,50)+.1 == Math.pow(2,50)


0

Tôi biết bạn quan tâm đến Số nguyên nên tôi sẽ không trả lời lại điều đó nhưng nếu bạn muốn kiểm tra số Dấu phẩy động, bạn có thể làm điều này.

function isFloat( x )
{
    return ( typeof x === "number" && Math.abs( x % 1 ) > 0);
}

Lưu ý: Điều này CÓ THỂ coi các số kết thúc bằng .0(hoặc bất kỳ số nào tương đương về mặt logic 0) là một INTEGER. Nó thực sự cần một lỗi chính xác dấu chấm động xảy ra để phát hiện các giá trị dấu chấm động trong trường hợp đó.

Ví dụ.

alert(isFloat(5.2));   //returns true
alert(isFloat(5));     //returns false
alert(isFloat(5.0));   //return could be either true or false

0

Khá nhiều thư viện tiện ích như YourJS cung cấp các hàm để xác định xem một cái gì đó là một mảng hay một cái gì đó là số nguyên hay nhiều kiểu khác. YourJS định nghĩa isInt bằng cách kiểm tra xem giá trị có phải là một số không và sau đó nếu nó chia hết cho 1:

function isInt(x) {
  return typeOf(x, 'Number') && x % 1 == 0;
}

Đoạn mã trên được lấy từ đoạn mã YourJS này và do đó chỉ hoạt động vì typeOfđược xác định bởi thư viện. Bạn có thể tải xuống phiên bản YourJS tối giản, chủ yếu chỉ có các chức năng kiểm tra kiểu như typeOf(), isInt()isArray(): http://yourjs.com/snippets/build/34,2


0

Bạn cũng có thể xem qua Runtyper - một công cụ thực hiện kiểm tra kiểu của các toán hạng trong ===(và các hoạt động khác).
Đối với ví dụ của bạn, nếu bạn có so sánh chặt chẽ x === yx = 123, y = "123", nó sẽ tự động kiểm tra typeof x, typeof yvà hiển thị cảnh báo trong bảng điều khiển:

So sánh chặt chẽ các loại khác nhau: 123 (số) === "123" (chuỗi)



0

Một cách tiếp cận sạch sẽ

Bạn có thể cân nhắc sử dụng một thư viện rất nhỏ, không phụ thuộc như Not . Giải quyết mọi vấn đề:

// at the basic level it supports primitives
let number = 10
let array = []
not('number', 10) // returns false
not('number', []) // throws error

// so you need to define your own:
let not = Object.create(Not)

not.defineType({
    primitive: 'number',
    type: 'integer',
    pass: function(candidate) {
        // pre-ECMA6
        return candidate.toFixed(0) === candidate.toString()
        // ECMA6
        return Number.isInteger(candidate)
    }
})
not.not('integer', 4.4) // gives error message
not.is('integer', 4.4) // returns false
not.is('integer', 8) // returns true

Nếu bạn biến nó thành thói quen, mã của bạn sẽ mạnh hơn rất nhiều. Typecript giải quyết một phần của vấn đề nhưng không hoạt động trong thời gian chạy, điều này cũng rất quan trọng.

function test (string, boolean) {
    // any of these below will throw errors to protect you
    not('string', string)
    not('boolean', boolean)

    // continue with your code.
}

1
bạn có thể vui lòng giải thích cách kiểm tra xem một cái gì đó có phải là số nguyên hay không bằng cách sử dụng kỹ thuật này?
sova

@sova tôi đã thêm ví dụ.
Calvintwr
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.