方法一
使用取余运算符判断,利用任何整数都会被1整除的原理,即余数是0的特点,通过这个规则来判断是否是整数。
let isInteger = (val) => val % 1 === 0; // true isInteger(5); // false isInteger(5.72);
以上输出可以看出这个函数挺好用,但对于
字符串
和某些特殊值
则需要完善一下检验规则,否则会被"欺骗",对于空字符串、字符串类型数字、布尔true、空数组都返回true。在取余的时候,它们都会进行类型装换,下面例子中的空字符串,空数组都是转化成0,而true转成1。// true isInteger(''); // true isInteger('5'); // true isInteger(true); // true isInteger([]);
优化
let isInteger = (val) => typeof val === 'number' && val % 1 === 0; // false isInteger(''); // false isInteger('5'); // false isInteger(true); // false isInteger([]);
方式二
使用
Math.round
、Math.ceil
、Math.floor
判断。整数取整后还是等于自己,利用这个特性来判断是否是整数。
Math.floor
方法中会自动将参数转成数字进行向下取值,同理使用Math.ceil
向上取整,Math.round
四舍五入。let isInteger = (val) => Math.floor(val) === val; // true isInteger(5); // false isInteger(5.72); // false isInteger(''); // false isInteger('5'); // false isInteger(true); // false isInteger([]);
方式三
通过parseInt()判断。利用parseInt()十进制的转化特点。
let isInteger = (val) => parseInt(val, 10) === val; // true isInteger(5); // false isInteger(5.72); // false isInteger(''); // false isInteger('5.72'); // false isInteger(true); // false isInteger([]);
但是对于超过检测范围的数就会不再检测,统一返回该检测数字的首个数字。
// 1 false parseInt(1000000000000000000000); // 4 false parseInt(412300213123400000000.21312);
方式四
通过位运算
|
判断。按位或运算符|
是双目运算符, 其功能是将参与运算的两数转成32位二进制后,各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。因此利用该特性,任一数字和0位或都是返回它本身,同理非数字都是进行类型转化后再进行位或。let isInteger(val) => (val | 0) === val; // true isInteger(5); // false isInteger(5.72); // false isInteger(''); // false isInteger('5'); // false isInteger(true); // false isInteger([]);
关于位或运算,效率比Math.floor和parseInt高。
位运算的使用场景及封装
方式五
ES6提供了Number.isInteger。这是Number中的一个API方法,用来判断给定参数是否为整数。
浏览器兼容上大多数已经实现支持,目前IE并不支持。// true Number.isInteger(5); // false Number.isInteger(5.72); // false Number.isInteger(''); // false Number.isInteger('5'); // false Number.isInteger(true); // false Number.isInteger([]);
结束语
以上就是判断是否为整数类型的五种方式,这五种方式各有优缺点,大家可以进行仔细比较,选择最优的进行使用。