递归深拷贝
基础版本 ,不兼容特殊对象、无法处理循环引用
let arrObj = [
{
path: '/login',
name: '登录',
exact: true,
render(props) {
// return (<div>什么呢</div>)
}
}
]
// 递归深拷贝
/**
* typeof 判断 null array 对象 都是 object, 但可以准确判断出函数为 function
*/
const deepClone = (source) => {
if (!source && typeof source !== 'object') {
throw new Error('err')
}
const container = source.constructor === Array ? [] : {}
Object.keys(source).forEach(item => {
if (source[item] && typeof source[item] === 'object') {
console.log('this', this); // window
container[item] = deepClone(source[item]) // this.deepClone
} else {
container[item] = source[item] // 函数这里是否是浅拷贝了?
}
})
return container
}
let copyObj = deepClone(arrObj)
let lightCopy = arrObj
console.log(copyObj === arrObj); // false
console.log(lightCopy === arrObj); // true
升级版,兼容特殊对象、循环引用
export const deepClone = (source: any) => {
let map = new WeakMap();// 对拷贝的对象做个记录
// typeof 判断数据类型 ,null , 对象,数组都是object
function deepContent(source: any) {
if (source === null) {// typeof判断 null 也为object , 这里需要再做一次判断
return null;
}
if (typeof source !== 'object') { // 去除可能为undefined 的值
return source;
}
if (source.constructor === Date) { // 兼容特殊对象
return new Date(source);
}
if (source.constructor === RegExp) {
return new RegExp(source);
}
if (map.get(source)) {// 如果存在 (之前做过记录),不再拷贝,直接返回
return map.get(source);
}
const currentItem = source.constructor === Array ? [] : {};
map.set(source, currentItem);// 其他情况才拷贝
for (let key in source) {
if (source.hasOwnProperty(key)) {
if (source[key] && typeof source[key] === 'object') {
currentItem[key] = deepContent(source[key]);
}
else {
currentItem[key] = source[key];
}
}
}
return currentItem;
}
return deepContent(source); // 返回值为一个函数的执行结果,结果是一个对象
};
九九乘法表(递归)
const chengfa = (num: number) => {
console.log('1111')
if (num == 1) {
console.log('1X1=1');
} else {
chengfa(num - 1) // 这里递归会连续调9次
console.log('牛皮',num);
for (var i = 1, str = ''; i <= num; i++) { // 每次递归的for循环都会等待前面的递归函数执行完毕,才执行下面的for循环
console.log('323232323232'); // 为什么会等待,函数要执行完毕!
str += i + 'x' + num + '=' + i * num + ' ' // 9 会等待8的递归,8 会等待7 ...
}
console.log(str)
}
}
console.log(chengfa(9));
// 1X1=1
// 1x2=2 2x2=4
// 1x3=3 2x3=6 3x3=9
// 1x4=4 2x4=8 3x4=12 4x4=16
// 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
// 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
// 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
// 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
// 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1111111
// 1X1=1
// 牛皮 2
// 323232323232
// 323232323232
// 1x2=2 2x2=4
// 牛皮 3
// 323232323232
// 323232323232
// 323232323232
// 1x3=3 2x3=6 3x3=9
// 牛皮 4
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x4=4 2x4=8 3x4=12 4x4=16
// 牛皮 5
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
// 牛皮 6
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
// 牛皮 7
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
// 牛皮 8
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
// 牛皮 9
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 323232323232
// 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
// undefined