3.3 对象的浅拷贝–Object.assign !!!
这里的Object.assign也是一个很奇怪的点,它既是深拷贝又是浅拷贝。一级属性-深拷贝,深层属性-浅拷贝
var obj = { a: 0 , b: { c: 0}};
var newObj = Object.assign({}, obj);
obj.a = 1;
obj.b.c = 3;
console.log(obj); // { a: 1 , b: { c: 3}};
console.log(newObj); // { a: 0 , b: { c: 3}};
可以很清楚的发现一级深拷贝,二级浅拷贝。
3.4 对象的浅拷贝-- 展开运算符(…)!!!
这里的展开运算符(…)同样是一个很奇怪的点,它既是深拷贝又是浅拷贝。一级属性-深拷贝,深层属性-浅拷贝
var obj = { a: 0 , b: { c: 0}};
var newObj = {...obj};
obj.a = 1;
obj.b.c = 3;
console.log(obj); // { a: 1 , b: { c: 3}};
console.log(newObj); // { a: 0 , b: { c: 3}};
可以很清楚的发现一级深拷贝,二级浅拷贝。
4. 深拷贝
在浅拷贝中已经介绍而来几种深拷贝的方式。
4.1 JSON.parse(JSON.stringify())
数组和对象均可用
数组
var arr = [1, 3, {
name: ' syl'
}];
var newArr = JSON.parse(JSON.stringify(arr));
arr[2].name = '123';
console.log(newArr[2]); /// 'syl ' 没有改变
对象
var obj={
name:'syl',
}
var newObj=JSON.parse(JSON.stringify(obj));
obj.name="123";
console.log(newObj.name); //'syl'. 没有改变
这种方法虽然可以实现数组或对象深拷贝,但不能处理函数
var arr = [1, 3, {
name: ' syl'
},function(){}];
var newArr = JSON.parse(JSON.stringify(arr));
console.log(newArr[3]) // null ,没有输出函数。
这是因为JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,不能接受函数
4.2 深拷贝通用–递归
function deepCopy(obj) {
//是否是数组或对象
if (typeof obj !== 'object') return;
var newObj = obj instanceof Array ? [] : {};
for (var key in obj) {
// 不遍历原型链上的属性,只遍历自身属性
if (obj.hasOwnProperty(key)) {
// 如果值是对象,就递归一下
if (obj[keys] && typeof obj[key ] === "object") {
newObj[key] = obj[key] instanceof Array ?[] : {};
// 如果是引用数据类型,会递归调用
newObj[key] = deepCopy(obj[key]);
} else {
// 如果不是,就直接赋值
newObj = obj[keys];
}
}
}
return result;
}
补充:
浅拷贝:es6中有两种新方法
方法1:
` let [...spread]= [12, 5, 8, 130, 44];
方法2:
Array.from(array)//创建一个新数组
前端资料汇总
我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。
首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。
更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。