对象(数组)的深克隆和浅克隆(头条)
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"