JavaScript

103 阅读2分钟

1. 在JS中的部分技巧

1. 位运算符

  1. << 与 >> 对数进行2的倍数运算

5 << 2 => 52n5 * 2^n

5 >> 2 => Math.floor(5/2n)Math.floor(5 / 2 ^n)

  1. >>>无符号运算符

所有非数值转换为 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转为二进制, 然后右移去除右边的两位, 相当于除以四再取整

  1. &判断奇偶

13 & 1 // 1 14 & 1 // 0

  1. 异或^实现两数交换

同号为零,异号为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 的区别

  1. call( ) 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用函数
  2. apply 与 call 非常相似,不同之处在于提供参数的方式,apply 使用的是参数数组
  3. 调用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('节流中');
        }
    }
}

其他: JavaScript 运行机制 Event Loop