日常

作者: Bougie 创建于: 2019-06-09 | 成长
  • 2019-06-15: 函数柯里化
好好想想先 😌
  • 参考链接
  • 一句话
    • 柯里化,可以理解为提前接收部分参数,延迟执行,不立即输出结果,而是返回一个接受剩余参数的函数
    • 优点:参数复用、延迟运行、扁平化
  • 2019-06-14: 代码实现 bind
好好想想先 😌
  • 参考链接
  • 一句话
    • 利用 eval 实现
    • 利用中间对象实现
  • 代码实现
    Function.prototype.myCall = function(context) {
      // 如果没有传或传的值为空对象 context指向window
      context = context || window
      context.fn = this //给context添加一个方法 指向this
      // 处理参数 去除第一个参数this 其它传入fn函数
      let arg = [...arguments].slice(1) //[...xxx]把类数组变成数组,arguments为啥不是数组自行搜索 slice返回一个新数组
      context.fn(...arg) //执行fn
      delete context.fn //删除方法
    }
    
  • 2019-06-13: 什么是原型和原型链,实现继承的方式
好好想想先 😌
  • 参考链接

  • 一句话

    • 每个实例对象( object )都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象( __proto__ ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节
    • obj.__proto__ === Obj.prototype
  • 代码实现

    • 原型链继承
    function Parent() {
      this.name = '张三'
    }
    Parent.prototype.getName = function() {
      console.log(this.name)
    }
    function Child() {}
    Child.prototype = new Parent()
    var child1 = new Child()
    
    • 构造函数继承
    function Parent() {
      this.names = ['张三', '李四']
    }
    function Child() {
      Parent.call(this)
    }
    var child1 = new Child()
    
  • 2019-06-12: instanceof 原理和代码实现
好好想想先 😌
  • 参考链接
  • 一句话
    • js 在底层存储变量的时候,会在变量的机器码的低位 1-3 位存储其类型信息,对于 undefined 和 null 来说,这两个值的信息存储是有点特殊的,由于 null 的所有机器码均为 0,因此直接被当做了对象来看待
    • obj.__proto__ === Obj.prototype
  • 代码实现
    function instanof(left, right) {
      return left.__proto__ === right.prototype
    }
    
  • 2019-06-11: 深拷贝和浅拷贝有什么不同,代码实现
好好想想先 😌
  • 参考链接
  • 一句话
    深拷贝和浅拷贝的主要区别就是其在内存中的存储类型不同,基本数据类型存放在栈中,基本数据类型值不可变;引用类型存放在堆中,引用类型值可变
  • 代码实现
    function extend(target, source, deep) {
      for (key in source) {
        if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
          if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
            target[key] = {}
          }
          if (isArray(source[key]) && !isArray(target[key])) {
            target[key] = []
          }
          extend(target[key], source[key], deep)
        } else if (source[key] !== undefined) {
          target[key] = source[key]
        }
      }
    }
    
  • 2019-06-10: new 操作发生了什么,函数实现
好好想想先 😌
  • 参考链接
  • 一句话
    1. 创建一个以这个函数为原型的空对象.
    2. 将函数的 prototype 赋值给对象的 __proto__ 属性
    3. 将对象作为函数的 this 传进去。如果有 return 出来东西是对象的话就直接返回 return 的内容,没有的话就返回创建的这个对象
  • 代码实现
    function objectFactory(Constructor, ...rest) {
      const instance = Object.create(Constructor.prototype)
      const result = Constructor.apply(instance, rest)
      return (typeof result === 'object' && result) || instance
    }
    
  • 2019-06-09: 什么是 javascript 迭代器和生成器
好好想想先 😌
上次更新: 2019-6-16 22:45:09