2015-11-14 3 views
0

И есть ли лучшие варианты?Является ли это допустимым типом проверки, если аргумент является целым?

function isInteger(x) { 
    // check if argument is a valid number and not NaN 
    if ((typeof x !== 'number') || (x !== x)) throw Error('Not a valid number') 
    // double binary inverse (inspired by `!!` operation) 
    return x === ~~x; 
} 
+0

'x! == x' всегда будет ложным независимо от типа или значения' x'. – techfoobar

+0

Говоря о 'x! == x' - либо я не понял вас правильно, либо вы ошибаетесь (' var x = 1; console.log (!! x) ' – walkthroughthecode

+0

' x = 1; (x! == x) 'возвращает' false' –

ответ

1

Не полностью.

Номера JS представляют собой 64-битные поплавки, но побитовые операторы поддерживают только 32-разрядные целые числа. Затем они усекают числа.

Именно поэтому вы можете использовать их, чтобы проверить, является ли число целым числом, например,

x === ~~x; 
x === (x|0); 
x === (x&-1); 

Однако, они не будут работать на целых больше, чем 2 -1 или ниже -2 :

var x = Math.pow(2, 31); 
x; // 2147483648 
Number.isInteger(x); // true 
x === ~~x; // false 
+0

Спасибо, что так много, это было именно то, что я искал !! – walkthroughthecode

1

Вместо этого вы можете использовать Number.isInteger. Посмотрите на polyfill:

Number.isInteger = Number.isInteger || function(value) { 
    return typeof value === "number" && 
      isFinite(value) && 
      Math.floor(value) === value; 
}; 

Edit: Также есть isNaN и Number.isNaN функции. Не используйте x !== x.

+0

Спасибо, я знаю об этом. Заинтересовано в самом решении. – walkthroughthecode

+0

Полис в связанной статье работает и для старых браузеров. –

0

Да, функция работает точно так, как ожидалось, она проверяет, действительно ли переменная, посланная через вызов функции, является целым числом, но вам не нужно проверять, (если x не равно x), вы можете опустить it (x! == x)

function isInteger(x) { 
    if (typeof x !== 'number') throw Error('Not a valid number') 
    return x === ~~x; 
} 
+0

Как насчет ситуации, когда мы передаем «NaN' в качестве аргумента? – walkthroughthecode

Смежные вопросы