1. 在JS中的部分技巧
1. 位运算符
- << 与 >> 对数进行2的倍数运算
5 << 2 =>
5 >> 2 =>
- >>>无符号运算符
所有非数值转换为 0
所有大于等于0的整数 取其整数部分
'string' >>> 0 // 0
null >>> 0 // 0
undefined >>> 0 // 0
[] >>> 0 // 0
{} >>> 0 // 0
123 >>> 0 // 123
34.56 >>> 0 // 34
0 >>> 0 // 0
-123 >>> 0 // 4294966084
number >>> 2 number转为二进制, 然后右移去除右边的两位, 相当于除以四再取整
- &判断奇偶
13 & 1 // 1 14 & 1 // 0
- 异或^实现两数交换
同号为零,异号为1
0^0 = 0;0^1=1;1^0=1;1^1=0
let a = 5, b = 7
a = a ^ b
b = b ^ a
a = a ^ b
console.log(a, b) // 7 5
2. 高级函数
1. call apply bind 的区别
- call( ) 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用函数
- apply 与 call 非常相似,不同之处在于提供参数的方式,apply 使用的是参数数组
- 调用bind时,返回的新函数的 this 被指定为 bind( ) 的第一个参数,而其余参数将作为新函数的参数
fun.call(obj, props);
fun.apply(obj, propsArr);
fun.bind(obj, props);
2. debounce 防抖
- 定义:前面的所有触发都被取消,最后一次执行在规定的时间之后才会触发,即连续触发,只执行最后一次 作用:缓解高并发请求的压力
function debounce(fn, interval = 300) {
let timer = null
return function () {
clearTimeout(timer)
timer = setTimeout(() => {
fn().call(this, arguments)
}, interval);
}
}
3. throttle 节流
- 定义:在一定的时间范围内的频繁触发,只执行一次回调,把频繁触发变为少量触发
function throttle(fn, interval) {
return function () {
if (fn) {
fn.call(this, arguments)
let func = fn // 备份一份fn
// 指定时间后恢复fn
let timer = setTimeout(() => {
fn = func
}, interval)
fn = null
} else {
console.log('节流中');
}
}
}