1. new 操作符的实现原理

    (1) 传入两个参数,构造函数 constructor,和剩余参数 args
    (2)对 constructor 是否是函数、是否是箭头函数进行处理
    (3)通过 Object.create(constructor.prototype),创建一个原型为 constructor.prototype 的 obj
    (4)使用 constructor.apply,传入创建的 obj 和 args ,接收结果 res
    (5)res 如果不是引用类型,返回 obj
    (6)res 如果是引用类型,返回 res

    1. function objectFactory() {
    2. let newObject = null;
    3. let constructor = Array.prototype.shift.call(arguments);
    4. let result = null;
    5. // 判断参数是否是一个函数
    6. if (typeof constructor !== "function") {
    7. console.error("type error");
    8. return;
    9. }
    10. // 新建一个空对象,对象的原型为构造函数的 prototype 对象
    11. newObject = Object.create(constructor.prototype);
    12. // 将 this 指向新建对象,并执行函数
    13. result = constructor.apply(newObject, arguments);
    14. // 判断返回对象
    15. let flag = result && (typeof result === "object" || typeof result === "function");
    16. // 判断返回结果
    17. return flag ? result : newObject;
    18. }
    19. // 使用方法
    20. objectFactory(构造函数, 初始化参数);
    1. map 和 Object 的区别 | 区别 | Map | Object | | —- | —- | —- | | key 的类型 | key 的类型可以是任意类型 | key 的类型必须是 string 或 Symbol | | key 的顺序 | 有序,按照插入的顺序排列 | 无序,按照字母序排列 | | size 大小 | 可以直接 .size 属性获取 | 只能通过手动计算 | | 迭代键值 | 可以直接通过 .keys 方法迭代 | 必须通过 Obejct.keys 获取 | | 性能 | 对频繁增删有优化 | 无优化 | | 意外的键值(比如不属于本身的键值) | 默认不包含任何值,只能显式的插入 | 可能会引用到原型链上的键值 |

    2. map 和 WeakMap 的区别 | 区别 | Map | WeakMap | | —- | —- | —- | | key 的类型 | key 的类型可以是任意类型 | 必须是引用类型 | | 设计目的 | hash 表 | 对对象进行关联,同时不用对象的时候就直接回收 | | 方法 | set(key, value)
      get(key)
      has(key)
      delete(key)
      clear()
      size Map 里的成员属性总数 | set(key, value)
      get(key)
      has(key)
      delete(key) |

    1.什么是协变与逆变
    https://docs.microsoft.com/zh-cn/dotnet/standard/generics/covariance-and-contravariance

    协变:指能够使用比原始指定的派生类的派生程度更大(更具体)的类型
    逆变:指能够使用比原始指定的派生类的派生程度更小(不太具体)的类型

    2.vue-loader 的实现原理是什么
    通过 webpack loader 对代码编译和打包

    3.React 中,cloneElement 与 createElement 各是什么,有什么区别

    1. cloneElement(element, [config], [...children])
    2. 是克隆一个传入的 React.Component
    3. config 当中可以传入 props(会和旧的 props 浅合并),
    4. key ref (会覆盖掉之前的)
    5. children 子组件(会覆盖掉之前的)
    6. 几乎等价于
    7. <element.type {...element.props} {...props}>{children}</element.type>
    8. createElement(type, [props], [...children])
    9. 是创建一个新元素
    10. 最大的区别就在于 clone 会保留原来的 props