每日五问,Day5

115 阅读1分钟

instanceof原理

  • 主要就是查询目标的原型链上是否存在需要判断的类型
function _instanceof(target, type) {
    let some = false
    if(target===null)return some
    some = target.__proto__ === type.prototype
    if(some) {
        return true
    }
    some = innstanceof(target.__proto__, type)
    return some
}

bind的实现

Function.prototype.bind = funtion(){
    const arg = Array.form(arguments)
    const _this = arg.shift()
    return () => {
        _this.fn = this
        const val = _this.fn(...args)
        delete _this.fn
        return val
    }
}

apply和call的作用及区别

  • 改变this
  • 不同的只是参数, apply第二位是一个数组
  • call, 第一位是this, 后面的安正常参数传入即可

v8垃圾回收机制

  • v8堆的垃圾回收主要分为两个区域
  • 我们姑且叫新老区域
  • 新区域主要储存短期存活的数据, 和小型数据
  • 老区主要储存的是 长期存活的和, 大型数据
  • 新区又分为两个区域
  • 一个储存区, 一个空闲区
  • 回收时把, 需要存活的数据拷贝到空闲区,然后清空原来的储存区
  • 因为新区是采用复制的形式来清理和整理数据, 所以新区空间通常都比较小, 存储的也只能是小型数据
  • 多次回收还存活的数据会被送入老区
  • 老区因为空间大, 所以完成一次回收, 需要的时间可能会比较长, 所以并不是一次性完成的收回,而是执行一段时间会释放线程, 避免造成卡顿

0.1+0.2为什么不等于0.3

  • 储存转2进制无法完全转化, 超出52位的0舍弃1进位
  • 所以后续运算等操作也可能存在精度丢失
  • 运算结果会保留17位的四舍五入
  • 0.1+0.2储存和运算都存在精度丢失导致了0.1+0.2!=0.3