2019年7月2日
GavinZhong opened this issue · comments
继承
Q:ES5为什么不能继承原生构造函数 ES6可以?
A:ES5 是先新建子类的实例对象this,再将父类的属性添加到子类上,由于父类的内部属性无法获取(子类无法获得原生构造函数的内部属性),导致无法继承原生的构造函数。比如,Array构造函数有一个内部属性[[DefineOwnProperty]],用来定义新属性时,更新length属性,这个内部属性无法在子类获取,导致子类的length属性行为不正常。
ES6 允许继承原生构造函数定义子类,因为 ES6 是先新建父类的实例对象this,然后再用子类的构造函数修饰this,使得父类的所有行为都可以继承。
基本数据类型和复杂数据类型区别
内存分配不同(基本数据类型 栈中 复杂数据类型存储在堆中,栈中存储的变量,是指向堆中的引用地址。) 访问机制不同 复制变量时不同 参数传递的不同
如何让 (a == 1 && a == 2 && a == 3) 的值为true?
知识点:类型转换 Symbol.toPrimitive ->valueOf ->toString
方案1:[Symbol.toPrimitive] 也可以定义valueOf toString
let a = {
[Symbol.toPrimitive]: (function() {
let i = 1;
//闭包的特性之一:i 不会被回收
return function() {
return i++;
}
})()
}
方案2 数组 数组的 toString 接口默认调用数组的 join 方法,重写数组的 join 方法。
let a =[1,2,3];
a.join = a.shift();
方案3 代理
let a = new Proxy({},{
i:1,
get:function(){
return ()=>this.i++;
}
})