标签:对象 [] 知识点 检测 obj 注意 深浅拷贝 red function
关于引用类型值的详解,请看另一篇随笔 https://www.cnblogs.com/jinbang/p/10346584.html
let obj = { name: "jin", arr: ["red","blue","black"]}; let obj1 = {}; Object.defineProperties(obj1, Object.getOwnPropertyDescriptors(obj)); // 深拷贝 Object.assign(obj1, obj); // 深拷贝 obj1 = JSON.parse(JSON.stringify(obj)); // 深拷贝 obj1 = deepCopy(obj); // 使用到深拷贝函数 obj1 = obj; // 浅拷贝 obj1 = Object.assign(obj); // 浅拷贝
下面是deepCopy()深拷贝函数,其中使用到了判断变量的类型函数
// 判断变量的类型 function getType(obj){ let str = Object.prototype.toString.call(obj); // 检测基本类型值,引用类型值的类型 let map = { ‘[object Boolean]‘: ‘boolean‘, ‘[object Number]‘: ‘number‘, ‘[object String]‘: ‘string‘, ‘[object Function]‘: ‘function‘, ‘[object Array]‘: ‘array‘, ‘[object Date]‘: ‘date‘, ‘[object RegExp]‘: ‘regExp‘, ‘[object Undefined]‘: ‘unfefined‘, ‘[object Null]‘: ‘null‘, ‘[object Object]‘: ‘object‘ }; if(obj instanceof Element){ return ‘element‘; } return map[str]; } // 深拷贝函数 function deepCopy(p){ let obj; let str = getType(p); if(str === ‘array‘){ obj = []; for(let i=0;i<p.length;i++){ // obj.push(p[i]); // 不能这样写,因为会把array的堆内存也会复制过去 obj.push(arguments.callee(p[i])); //回调自己 } }else if(str === ‘object‘){ obj = {}; for(let i in p){ // obj[i] = p[i]; // 不能这样写,因为会把object的堆内存也会复制过去 obj[i] = arguments.callee(p[i]); //回调自己 } } else { return p; } return obj; }
需要特别注意的是,使用JSON.parse(JSON.stringify(x))不是一个很好的选择,也算是它们的坑吧:
function Person(name){ this.name = name; } var person = new Person(‘liai‘); var test = { name: ‘jin‘, person: person, //对象是由构造函数生成的:会丢弃对象的constructor date: new Date(), //序列化后返回是字符串,不是时间对象 regexp: new RegExp(‘\\w+‘), //序列化后返回空对象:{} err: new Error(), //序列化后返回空对象:{} fun: function(){}, //序列化后会丢失 undef: undefined, //序列化后会丢失 nun: NaN, //序列化后返回null }; console.log(test); console.log(JSON.parse(JSON.stringify(test)));
标签:对象 [] 知识点 检测 obj 注意 深浅拷贝 red function
原文地址:https://www.cnblogs.com/jinbang/p/10346649.html