Object.assign() 方法用于将全部可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。前端
若是目标对象中的属性具备相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将相似地覆盖前面的源对象的属性。jquery
Object.assign 方法只会拷贝源对象自身的而且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标对象的[[Set]],因此它会调用相关 getter 和 setter。所以,它分配属性,而不单单是复制或定义新的属性。若是合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。git
String类型和 Symbol 类型的属性都会被拷贝。github
在出现错误的状况下,例如,若是属性不可写,会引起TypeError,若是在引起错误以前添加了任何属性,则能够更改target对象。面试
Object.assign 不会在那些source对象值为 null
或 undefined
的时候抛出错误。数组
针对深拷贝,须要使用其余办法,由于 Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。也就是说,若是对象的属性值为简单类型(如string, number),经过Object.assign({},srcObj);获得的新对象为深拷贝
;若是属性值为对象或其它引用类型,那对于这个对象而言实际上是浅拷贝
的。bash
用 JSON.stringify 把对象转换成字符串,再用 JSON.parse 把字符串转换成新的对象。ui
能够转成 JSON 格式的对象才能使用这种方法,若是对象中包含 function 或 RegExp 这些就不能用这种方法了。spa
//经过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj) {
let _obj = JSON.stringify(obj);
let objClone = JSON.parse(_obj);
return objClone;
}
复制代码
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,可是对象中有对象的时候,此方法,在二级属性之后就是浅拷贝。code
let $ = require('jquery');
let obj1 = {
a: 1,
b: {
f: {
g: 1
}
},
c: [1, 2, 3]
};
let obj2 = $.extend(true, {}, obj1);
复制代码
let _ = require('lodash');
let obj1 = {
a: 1,
b: { f: { g: 1 } },
c: [1, 2, 3]
};
let obj2 = _.cloneDeep(obj1);
复制代码
function _deepClone(source) {
let target;
if (typeof source === 'object') {
target = Array.isArray(source) ? [] : {}
for (let key in source) {
if (source.hasOwnProperty(key)) {
if (typeof source[key] !== 'object') {
target[key] = source[key]
} else {
target[key] = _deepClone(source[key])
}
}
}
} else {
target = source
}
return target
}
复制代码
更多经典前端面试题,请到github查看或参与讨论github.com/daily-inter…