GavinZhong / interview

Fighting

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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++;
}

})