перевірка типу в javascript


76

Як я можу перевірити, чи є змінна на сьогодні цілочисельним типом? Я шукав якийсь ресурс для цього, і я думаю, що оператор === важливий, але я не впевнений, як перевірити, чи є змінна цілим числом (або масивом з цього приводу)


9
== перевіряє рівність значення, === перевіряє рівність значення та типу. "1" == 1 буде правдою, "1" === 1 буде хибним
Кай

Ви можете розглянути можливість використання такої невеликої бібліотеки, як Not . Вирішує всі проблеми.
Calvintwr,

Відповіді:


124

Змінна ніколи не буде цілочисельним типом у JavaScript - вона не розрізняє різні типи числа.

Ви можете перевірити, чи мінлива містить число, і чи це число є цілим числом.

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

Якщо змінна може бути рядком, що містить ціле число, і ви хочете перевірити, чи це так:

foo == parseInt(foo, 10)

2
Ви також можете використовувати isNaN (foo) w3schools.com/jsref/jsref_NaN.asp замість typeof
m4tt1mus

4
"він не розрізняє різні типи числа". Це тому, що не існує різних типів числа. Усі числові значення в JS є 64-розрядними плаваючими.
NullUserException

1
@NullUserException - ось що я сказав.
Квентін

Якщо ви використовуєте jQuery, ви можете використовувати функцію $ .type (). Напр. $ .type ("1") # => "рядок"
Андрій

2
Цю відповідь слід оновити, оскільки вона несумісна з функцією ECMAScript 2015 Number.isInteger . Це повинно повернути false для Нескінченності , не true.
RobG

16

У наші дні ECMAScript 6 (ECMA-262) знаходиться "в будинку". Використовуйте Number.isInteger(x)для того, щоб задати питання, яке ви хочете задати щодо типу x:

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

7

Число є цілим числом, якщо його модуль% 1 дорівнює 0-

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

Це настільки добре, наскільки отримує javascript - скажімо + - десять до 15 числа.

isInt(Math.pow(2,50)+.1)повертається true, як і робить Math.pow(2,50)+.1 == Math.pow(2,50)


0

Я знаю, що ви зацікавлені у цілочисельних числах, тому я не відповім на це, але якщо ви коли-небудь захочете перевірити наявність чисел із плаваючою комою, ви можете це зробити.

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

Примітка: Цей МОЖЕ розглядати числа, що закінчуються на .0(або будь-яку логічно еквівалентну кількість0 ), як ЦІЛИЙ. Насправді для виявлення значень з плаваючою точкою виникає помилка точності з плаваючою точкою.

Напр.

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

0

Досить багато службових бібліотек, таких як YourJS, пропонують функції для визначення, чи є щось масивом, чи це ціле число, або багато інших типів. YourJS визначає isInt , перевіряючи, чи є значення числом, а потім, якщо воно ділиться на 1:

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

Вищезазначений фрагмент було взято з цього фрагменту YourJS і, отже, працює лише тому typeOf, що визначений бібліотекою. Ви можете завантажити мінімалістичну версію YourJS, яка в основному має лише функції перевірки типу, такі як typeOf(), isInt()та isArray(): http://yourjs.com/snippets/build/34,2


0

Ви також можете поглянути на Runtyper - інструмент, який виконує перевірку типу операндів у ===(та інших операціях).
Наприклад, якщо у вас є суворе порівняння x === yта x = 123, y = "123", воно автоматично перевірить typeof x, typeof yі покаже попередження в консолі:

Суворе порівняння різних типів: 123 (число) === "123" (рядок)



0

Чистий підхід

Ви можете розглянути можливість використання дуже маленької бібліотеки без залежностей, наприклад Not . Вирішує всі проблеми:

// 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

Якщо ви увійдете в звичку, ваш код стане набагато сильнішим. Машинопис вирішує частину проблеми, але не працює під час виконання, що також важливо.

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
не могли б ви пояснити, як перевірити, чи є щось цілим, використовуючи цей прийом?
sova

@sova я додав приклад.
Calvintwr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.