Object.assign 和 扩展运算符:
Object.assign 和扩展运算符,都只会拷贝第一层,如果属性是一个对象,则当此对象发生改变时,复制出来的对象的相应属性也会发生改变。
Object.assign...obj
JSON.parse(JSON.stringify(obj)):
1. 当存在循环引用的时候,会发生异常,报错;
2.属性为undefined或function的时候,则属性会丢失;因为undefined和function不能被json化;
3.JSON.parse的参数,必须是一个标准的JSON串,也就是串中对应的属性名必须被双引号””括起来;
var obj1 = {a: 11, b: 56, c: undefined};var obj2 = JSON.parse(JSON.stringify(obj1));
深拷贝代码:
// 深拷贝var deepClone = (obj) =>{var newObj = Array.isArray(obj) ? [] : {};if (obj && typeof obj === 'object') {for(let key in obj) {// 过滤掉不可枚举的属性和继承来的属性if (obj.hasOwnProperty(key)){if (obj[key] && typeof obj[key] === 'object'){newObj[key] = deepClone(obj[key]);}else {newObj[key] = obj[key];}}}}else {return obj;}return newObj;};var obj = {name: 'David',age: 26,friend: {name: 'Jim',age: 29}};var newObj = deepClone(obj);newObj.friend.age = 36;console.log(obj);console.log(newObj);
混入Mixin:
let mixin = {sing(){console.log('singing');},run(){console.log('running');}};class Student{constructor(name){this.name = name;}}Object.assign(Student.prototype, mixin);let stu = new Student('Jim');stu.sing();
