js数组去重以及深浅拷贝
一、数组去重
// ES5 实现
function unique(arr) {
var res = arr.filter(function(item, index, array) {
return array.indexOf(item) === index
})
return res
}
// ES6实现
var unique = arr => [...new Set(arr)]
二、深浅拷贝
浅拷贝
如果我们要复制对象的所有属性都不是引用类型时,就可以使用浅拷贝,实现方式就是遍历并复制,最后返回新的对象。
function shallowCopy(obj) {
if (typeof obj !== 'object') return;
let newObj = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = obj[key];
}
}
return newObj;
}
深拷贝
如果我们需要复制一个拥有所有属性和方法的新对象,就要用到深拷贝,JS并没有内置深拷贝方法,主要是因为:
- 深拷贝怎么定义?我们怎么处理原型?怎么区分可拷贝的对象?原生DOM/BOM对象怎么拷贝?函数是新建还是引用?这些edge case太多导致我们无法统一概念,造出大家都满意的深拷贝方法来。
- 内部循环引用怎么处理,是不是保存每个遍历过的对象列表,每次进行对比,然后再造一个循环引用来?这样带来的性能消耗可以接受吗。
const obj = {
age: 20,
name: 'jack',
address: {
city: '四川'
},
arr: [1, 2, 3]
}
const obj1 = deepClone(obj);
obj1.address.city = '北京';
console.log('%c ======>>>>>>>>','color:orange;',obj);
console.log('%c ======>>>>>>>>','color:orange;',obj1)
function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
return obj
}
let result;
if (obj instanceof Array) {
result = []
} else {
result = {}
}
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key]);
}
}
return result
}
以上这些都是工作中比较常用的