const llf = {
uname: 'llf',
age: 24,
}
const ifeng = llf
ifeng.age = 25
console.log(llf);
这里我们改了ifeng的age,打印llf发现llf的age也变成了25,直接赋值的方法只要是对象,都会互相影响,因为直接拷贝对象栈里面的地址,
递归是自己调用自己,函数内部自己调用自己,但是会栈溢出,因为一直调用自己 ,需要加判断条件,符合判断条件时阻止调用自己ctrl
let i=1;
function ikun() {
console.log(`这是第${i}次唱跳rap篮球`);
if (i >= 6) {
return
}
i++
ikun()
}
ikun()
利用递归函数实现用setTimeout实现setinterval的功能,toLocaleString是new Date()内置对象的一个方法,获取当前的时间。
<div> </div>
function getTime() {
document.querySelector('div').innerHTML = new Date().toLocaleString()
setTimeout(getTime, 1000)
}
getTime()
浅拷贝进一步判断变成深拷贝,cxk是旧对象,wyf是空的新对象。
因为浅拷贝拷贝的是简单数据类型是直接拷贝值,如果属性值是引用数据类型则拷贝的是地址,简单数据类型后期如果更改wyf的属性值是不会影响旧对象cxk的,
如果是像下面案例一样,cxk对象里面再嵌套一个复杂数据类型hoppy的话,后期更改wyf的hoppy就会影响旧对象cxk的hoppy,因为wyf喜欢未成年。
浅拷贝如果是一层对象的,不互相影响,如果多层对象拷贝还是会互相影响
const cxk = {
uname: 'cxk',
age: 18,
hoppy: ['唱', '跳', 'rap', '篮球']
}
const wyf = {}
// 利用for in 遍历cxk这个对象, 让cxk的值赋值给wyf的值, cxk[k]指的是值, 里面的k是指属性和方法的名字, 这样让cxk的所有对象都加入到wyf这个空对象了
function ikun(wyf, cxk) {
for (let k in cxk) {
wyf[k] = cxk[k]
}
}
ikun(wyf, cxk)
wyf.hoppy[0] = '未成年'
console.log(cxk);
// 我们这里把wyf的hoppy改成了未成年,但是输出一下cxk,发现cxk也变成了未成年,ikun们不同意,
// 所以我们现在再加一个判断条件变成深拷贝,避免这个情况
function ikun(wyf, cxk) {
for (let k in cxk) {
// 判断cxk[k]是否属于数组,instanceof判断是否为数组
if (cxk[k] instanceof Array) {
// 其实就是把cxk的hoppy进行遍历
//再赋值给wyf[] 本来还需要进行一次forin进行遍历
// 但是外层这个ikun就是遍历,所以我们再次调用一下ikun
// 先声明一个空数组,把旧数组装进空数组
wyf[k] = []
// ikun(wyf[k], ['唱', '跳', 'rap', '篮球'])
ikun(wyf[k], cxk[k])
} else {
wyf[k] = cxk[k]
}
}
}
ikun(wyf, cxk)
wyf.hoppy[0] = '未成年'
console.log(cxk);
这个时候我们再次更改wyf的hoppy,发现已经影响不了cxk了,ikun是无敌的 冲冲冲