- 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
function objectFactory() {
let newObject = null;
let constructor = Array.prototype.shift.call(arguments);
let result = null;
// 判断参数是否是一个函数
if (typeof constructor !== "function") {
console.error("type error");
return;
}
// 新建一个空对象,对象的原型为构造函数的 prototype 对象
newObject = Object.create(constructor.prototype);
// 将 this 指向新建对象,并执行函数
result = constructor.apply(newObject, arguments);
// 判断返回对象
let flag = result && (typeof result === "object" || typeof result === "function");
// 判断返回结果
return flag ? result : newObject;
}
// 使用方法
objectFactory(构造函数, 初始化参数);
map 和 Object 的区别 | 区别 | Map | Object | | —- | —- | —- | | key 的类型 | key 的类型可以是任意类型 | key 的类型必须是 string 或 Symbol | | key 的顺序 | 有序,按照插入的顺序排列 | 无序,按照字母序排列 | | size 大小 | 可以直接 .size 属性获取 | 只能通过手动计算 | | 迭代键值 | 可以直接通过 .keys 方法迭代 | 必须通过 Obejct.keys 获取 | | 性能 | 对频繁增删有优化 | 无优化 | | 意外的键值(比如不属于本身的键值) | 默认不包含任何值,只能显式的插入 | 可能会引用到原型链上的键值 |
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 各是什么,有什么区别
cloneElement(element, [config], [...children])
是克隆一个传入的 React.Component ,
config 当中可以传入 props(会和旧的 props 浅合并),
key 和 ref (会覆盖掉之前的)
children 子组件(会覆盖掉之前的)
几乎等价于
<element.type {...element.props} {...props}>{children}</element.type>
createElement(type, [props], [...children])
是创建一个新元素
最大的区别就在于 clone 会保留原来的 props