乐趣区

2019前端面试题(持续更新)

1,讲讲浅拷贝、深拷贝之间的区别
核心:引用类型和非引用类型的拷贝结果是不同的
浅拷贝只是拷贝基本类型的数据,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,因此存在父对象被篡改的可能,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存
// 简单的浅拷贝
var a = 1;
var b = a;// 赋值
console.log(b) //1
a = 2;// 改变 a 的值
console.log(b) //1
如果要实现深拷贝,用什么方法来实现
JSON.parse() + JSON.stringify()(缺点:只能处理可以被枚举的属性);for in 循环递归遍历;
深拷贝就是能够实现真正意义上的数组和对象的拷贝。递归调用 ” 浅拷贝 ”。(深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象)
如果你想要实现支持 setter 和 getter 特性的拷贝,该怎么实现?
Object.defineproperties(定义属性)、Object.getOwnPropertyDescriptors(es2017,获取对象的多个属性)、Object.getOwnPropertyDescriptor(老一点,获取对象的单个属性的属性),但 babel 可以解决。
2、原型链的 prototype 和__proto__的区别;

prototype 在 new 示例后会被转为 __proto__

__proto__是非标准化的;

所有东西的原型链向上延伸到原型链的顶端,是什么;

Object.prototype.__proto__,结果是 null.
Function 本身就是函数,
Function.__proto__
是标准的内置对象 Function.prototype,
Function.prototype.__proto__
是标准的内置对象 Object.prototype
3、如果想实现继承,说几种你知道的方法?
原型链继承、构造继承、实例继承、拷贝继承、组合继承、寄生组合继承
原型链继承
3、var、let、const 的区别;

var 会变量提升;
let 声明的变量只在它所在的代码块有效;
const 声明后不能再修改其指向的目标,假如 const 指向的是一个对象 / 数组,那么虽然不能更改指向目标,但是可以更改对象和数组内部的值;

进阶一:说到变量提升,class 声明一个类时,存在变量提升么?为什么?
不存在。因为要方便类的继承,先声明子类再声明父类;
进阶二:const 声明一个对象,如何让对象内部的属性的值也无法改变?

使用 Object.freeze() 锁死(es5 新增特性);
对数组等引用类型的值,还是能修改的;

进阶三:全局作用域?函数作用域?块级作用域?作用域链?

退出移动版