// 方法1 Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。返回所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。// 这样做的好处就是能够提前定义好最后返回的数据类型。functiondeepClone(obj){let res =null;const reference =[Date, RegExp, Set, WeakSet, Map, WeakMap, Error];if(reference.includes(obj?.constructor)){
res =newobj.constructor(obj);}elseif(Array.isArray(obj)){
res =[];
obj.forEach((e, i)=>{
res[i]=deepClone(e);});}elseif(typeof obj ==="Object"&& obj !==null){
res ={};for(const key in obj){if(Object.hasOwnProperty.call(obj, key)){
res[key]=deepClone(obj[key]);}}}else{
res = obj;}return res;}// 方法2: 用hash来存储已经加载过的对象,如果已经存在的对象,就直接返回。functiondeepClone(obj, hash =newWeakMap()){if(hash.has(obj)){return obj;}let res =null;const reference =[Date, RegExp, Set, WeakSet, Map, WeakMap, Error];if(reference.includes(obj?.constructor)){
res =newobj.constructor(obj);}elseif(Array.isArray(obj)){
res =[];
obj.forEach((e, i)=>{
res[i]=deepClone(e);});}elseif(typeof obj ==="Object"&& obj !==null){
res ={};for(const key in obj){if(Object.hasOwnProperty.call(obj, key)){
res[key]=deepClone(obj[key]);}}}else{
res = obj;}
hash.set(obj, res);return res;}// 方法3: iview 方案functiondeepCopy(data){const t =typeOf(data);let o;if(t ==='array'){
o =[];}elseif( t ==='object'){
o ={};}else{return data;}if(t ==='array'){for(let i =0; i < data.length; i++){
o.push(deepCopy(data[i]));}}elseif( t ==='object'){for(let i in data){
o[i]=deepCopy(data[i]);}}return o;}
11. 生产随机字符
functionrandomStr(len =32){const $chars ='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';const maxPos = $chars.length;let str ='';for(let i =0; i < len; i++){
str += $chars.charAt(Math.floor(Math.random()* maxPos));}return str;}