前端八股文二

142 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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__指向原型对象。

结束

今天就更新到这里了,下一期见吧