前端面试题总结
一、JavaScript中判断为整数的多种方式
方式一、使用取余运算符判断
function
isInteger(obj) {
return
obj%1 === 0
}
正确:
isInteger(4)
// true
isInteger(4.8)
// false
错误:
isInteger(
''
)
// true
isInteger(
'4'
)
// true
isInteger(
true
)
// true
isInteger([])
// true
缺点:对于空字符串、字符串类型数字、布尔true、空数组都返回了true
改善:判断下对象是否是数字
function
isInteger(obj) {
return
typeof
obj ===
'number'
&& obj%1 === 0
}
方式二、【推荐】使用Math.round、Math.ceil、Math.floor判断
原理:整数取整后还等于本身。利用这个特性来判断是否是整数,Math.floor示例,如下
function
isInteger(obj) {
return
Math.floor(obj) === obj
}
isInteger(4)
// true
isInteger(4.8)
// false
isInteger(
''
)
// false
isInteger(
'4'
)
// false
isInteger(
true
)
// false
isInteger([])
// false
方式三、通过parseInt判断
function
isInteger(obj) {
return
parseInt(obj, 10) === obj
}
正确:
isInteger(4)
// true
isInteger(4.8)
// false
isInteger(
''
)
// false
isInteger(
'4'
)
// false
isInteger(
true
)
// false
isInteger([])
// false
错误:
isInteger(10000000000000000000000)
// false
缺点:parseInt在解析整数之前强迫将第一个参数解析成字符串。
方式四、通过位运算判断
function
isInteger(obj) {
return
(obj | 0) === obj
}
正确:
isInteger(4)
// true
isInteger(4.8)
// false
isInteger(
''
)
// false
isInteger(
'4'
)
// false
isInteger(
true
)
// false
isInteger([])
// false
错误:
isInteger(Math.pow(2, 32))
// 32位以上的数字返回false了
缺点:位运算只能处理32位以内的数字,对于超过32位的无能为力。
方式五、ES6提供了Number.isInteger
Number.isInteger(4)
// true
Number.isInteger(4.8)
// false
Number.isInteger(
''
)
// false
Number.isInteger(
'4'
)
// false
Number.isInteger(
true
)
// false
Number.isInteger([])
// false
总结:对于ES5中,推荐使用
Math.floor(obj) === obj,ES6中推荐使用
Number.isInteger方法。二、写一个json对象转地址栏参数的功能
function qsStringify(object) {
let keys = Object.keys(object)
let string = ''
keys.forEach(key => {
string += `${key}=${object[key]}&`
});
return string.substring(0, string.length -1)
}
function param(data) {
let url = ''
for (var k in data) {
let value = data[k] !== undefined ? data[k] : ''
url += `&${k}=${encodeURIComponent(value)}`
}
return url ? url.substring(1) : ''
}