1. 说一下继承的几种方式及优缺点?
方式
- 借用构造函数继承,使用call或apply方法,将父对象的构造函数绑定在子对象上
- 原型继承,将子对象的prototype指向父对象的一个实例
- 组合继承
缺点
- 原型链继承
字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。 - 借用构造函数(类式继承)
借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。 - 组合式继承
组合式继承是比较常用的一种继承方法,其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。
2. 闭包
闭包的实质是因为函数嵌套而形成的作用域链
闭包的定义即:函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包
优点
避免全局变量的污染
希望一个变量长期存储在内存中(缓存变量)
缺点
内存泄露(消耗)
常驻内存,增加内存使用量
3. 防抖和节流的区别
防抖:任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行
节流:指定时间间隔内只会执行一次任务
4. 判断 js 类型的方式
- typeof
可以判断出'string','number','boolean','undefined','symbol'
但判断 typeof(null) 时值为 'object'; 判断数组和对象时值均为 'object' - instanceof
原理是 构造函数的 prototype 属性是否出现在对象的原型链中的任何位置
function A() {}
let a = new A();
a instanceof A //true,因为 Object.getPrototypeOf(a) === A.prototype;
- Object.prototype.toString.call()
常用于判断浏览器内置对象,对于所有基本的数据类型都能进行判断,即使是 null 和 undefined - Array.isArray()
用于判断是否为数组
5. 四种常见的内存泄漏
1.全局变量 不用 var 声明的变量,相当于挂载到 window 对象上。如:b=1; 解决:使用严格模式
2.被遗忘的定时器和回调函数
3.闭包
4.没有清理的 DOM 元素引用