持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
题外话
周围的同事越来越少了,加油啊
正文
1. 深拷贝、浅拷贝
这道问题也算是经典问题之一了,今天就来详细说说
先说说面试的时候怎么说能回答到点子上。有些人是这样回答的
B复制A,当A改变的时候B跟着一起改变,这就是浅拷贝;如果B没有跟着一起改变就是深拷贝。
实际上,这个回答是错误的,我们需要在补充一些
答:B复制A,当A改变的时候B跟着一起改变,这就是浅拷贝;如果B没有跟着一起改变就是深拷贝。对于引用类型来说,第一层的拷贝都是深拷贝,更深层次的引用类型的拷贝是浅拷贝。
实现浅拷贝
- Object.assign()
var target={name:'guxin',age:18};
var source={state:'single'}
var result=Object.assign(target,source);
console.log(target,target==result);
//{name: 'guxin', age: 18, state: 'single'} true
- 扩展运算符
let obj = {name: "abc"}
let newObj = {...obj}
//{name: "abc"}
- 手动实现
function shallowClone(copyObj) {
let obj = Array.isArray(copyObj) ? [] : {}
for (let i in copyObj) {
obj[i] = copyObj[i]
}
return obj
}
实现深拷贝
- JSON.parse(JSON.stringify(obj))
缺点:会忽略undefined,Symbol;不能序列化函数;不能解决循环引用的对象
- 自己实现
function deepClone(copyObj){
let obj = Array.isArray(copyObj) ? [] : {}
if(copyObj && typeof copyObj === 'object'){
for(key in copyObj){
if(copyObj.hasOwnProperty(key)){ //返回布尔值,判断对象自身属性中是否有指定的键
if(copyObj[key] && typeof copyObj[key] === 'object'){
obj[key] = deepClone(copyObj[key])
}else{
obj[key] = copyObj[key]
}
}
}
}
return obj
}
原型、原型链
这道题的出现频率好像都不需要介绍了
每个引用类型都有一个[[prototype]]隐式原型,可以通过__proto__属性查看,函数是一个特殊的引用类型,还拥有了prototype显示原型。
当我们查找一个属性的时候,在自身没有找到,就会通过__proto__属性去它的原型对象上查找,沿着这条链路一直向上查找,一直找到Object都没有查找到就返回undefined;反之就返回查找到的值。这条链路就是原型链。
构造函数、原型对象、实例对象之前的关系
构造函数的prototype属性指向原型对象,而原型对象里面的constructor指向构造函数 构造函数通过new实例化对象的就是实例对象,实例对象通过__proto__指向原型对象。
结束
今天就更新到这里了,下一期见吧