浅拷贝 function clon(origin, target) { //orgin是原对象,target是目标对象 var tar = target || {}; //如果没有传入目标对象则创建一个空对象 for (var key in origin) { if (origin.hasOwnProperty(key)) { //判断传入的都是origin对象的自身属性,去除了原型链上的其它属性 tar[key] = origin[key]; } } return tar; } 深拷贝 function deepClon(origin, target) { //orgin是原对象,target是目标对象 var target = target || {}, toStr = Object.prototype.toString, arrType = '[object Array]'; for (var key in origin) { if (origin.hasOwnProperty(key)) { //判断传入的都是origin对象的自身属性,去除了原型链上的其它属性 if (typeof (origin[key]) === 'object' && origin[key] !== null) { //判断属性是不是引用值 //origin[key] === 'object' 判断origin对象属性是不是一个对象(引用值) //origin[key] !== null 因为null打印出来也是object所以也要去除 if (toStr.call(origin[key]) === arrType) { //判断引用值是否是数组 target[key] = []; } else { //引用值是对象 target[key] = {}; } deepClon(origin[key], target[key]); //当内部有引用值属性的时候进行递归 } else { //属性不是引用值 target[key] = origin[key]; } } } return target; }