ES6 展开运算符(...)
展开运算符... 和 Object.assign 的用法相似,但是后面的写法太长了,现在都在用...的方式
合并数组
let arr1 = [1, 2, 3];let arr2 = [4, 5, 6];
复制代码
在我们日常开发过程中,经常会合并两个数组的数据,在此之前,利用 for 循环依次将第二个数组每个数据输入到第一个数组中,这样不仅会降低开发效率,代码量也会很大。使用 es6 的展开运算符可以快速的合并两个数组。
let arr3 = [...arr1, ...arr2];console.log(arr3); // [1, 2, 3, 4, 5, 6]
复制代码
合并对象
与数组合并相似,使用 es6 的展开运算符可以快速的合并两个对象。
let school = {name: 'sylu'};let address = {add: 'shenyang'};
let mine = {...school, ...address};console.log(mine); // {name: 'sylu', add: 'shenyang'}
复制代码
这样合并后,如果再改变原来对象的值,新对象的值也会改变,这就说明合并的过程是浅拷贝。解决这个问题,可以先将对象转化成字符串,再转化成 JSON,这样一来就是深拷贝,解决了这个问题。
let me = JSON.parse(JSON.stringify({...school, ...address}));
复制代码
这样其实也会有一个问题,就是如果对象里有函数,而 JSON.stringify 不支持将函数转化,这里就需要自己实现深拷贝。
手写深拷贝
(思路:递归拷贝,一层层拷贝)
function deepClone(obj){ if(obj == null) return obj; if(obj instanceof Date) return new Date(obj); if(obj instanceof RegExp) return new RegExp(obj); if (typeof obj !== 'object') return obj; let cloneObj = new obj.constructor; for(let key in obj){ if(obj.hasOwnProperty(key)) { cloneObj[key] = deepClone(obj[key]); } } return cloneObj;}let obj = {age: 18}let n = deepClone(obj);console.log(n);
复制代码
手写深拷贝也是面试经常会遇到的问题(必须拿捏)👌
评论