一线大厂前端面试题汇总(二)

380 阅读1分钟

对象(数组)的深克隆和浅克隆(头条)

let obj = {
    a: 100,
    b: [10, 20, 30],
    c: {
        x: 10
    },
    d: /^\d+$/
};

浅拷贝

        let copyObj={};
        for(let key in obj){
            if(!obj.hasOwnProperty(key)) break;
            copyObj[key] = obj[key];
        }

ES6实现浅克隆

let copyObj = {...obj}

深拷贝

let copyObj2 = JSON.parse(JSON.stringify(obj));

弊端: 不能拷贝正则、时间类型、函数

参考答案

        function deepClone(obj){
            if(typeof obj !=='object') return obj;
            if(obj instanceof RegExp) return new RegExp(obj);
            if(obj instanceof Date) return new Date(obj);

            let copyObj = new obj.constructor;
            for(let key in obj){
                if(obj.hasOwnProperty(key)){
                    copyObj[key] = deepClone(obj[key]);
                }
            }
            return copyObj;
        }

堆栈内存考察(百度)

let a={}, b='0', c=0;  
a[b]='掘金';
a[c]='金掘';  
console.log(a[b]);

参考: 金掘,数字属性与字符串类型属性 指向的是同一块堆内存。

let a={}, b=Symbol('1'), c=Symbol('1');  
a[b]='掘金';
a[c]='金掘';  
console.log(a[b]);

参考: 掘金,Symbol唯一性,堆内存会重新生成一块新内存。

let a={}, b={n:'1'}, c={m:'2'};  
a[b]='掘金';
a[c]='金掘'; 
console.log(a[b]);

参考: 金掘,对象在内存中都会转换成 "[object Object]" 字符串,所以会被覆盖

闭包

var a=0,
    b=0;
function A(a){
    A=function(b){
        alert(a+b++);
    };
    alert(a++);
}
A(1);
A(2);

参考: "1" "4"