递归:自己调用自己
案例:累加和斐波那契数列
function fn1() {
var n = 10;
console.log(n);
fn2();
}
function fn2() {
var n = 20;
console.log(n);
}
fn1();
//使用递归实现累加1+2+。。。+n
function getSum(n) {
//终止条件
if (n == 1) {
return 1;
} else {
return n + getSum(n - 1);
}
}
console.log(getSum(10));
//递归实现斐波那契数列
function fib(n) {
if (n === 1 || n == 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
var m = 5;
//输出前5项
for (var i = 1; i < m + 1; i++) {
console.log(fib(i));
}
浅拷贝:就是单层复制,如果里面有对象和数组,就没有开辟新的内存。
//浅拷贝---单层复制
var obj1 = {
name: 'zs',
age: 18,
dog: {
name: '金毛',
age: 2
}
};
var obj2 = {};
for (var key in obj1) {
//这里不可以使用obj2.key 因为点是确定的属性,这里没有key这个属性,所以只能使用[]
obj2[key] = obj1[key];
}
obj1.name = 'xx';
obj1.dog.name = '大黄'; //这时对象1和对象2中的狗的名字都发生了改变,说明没有开辟新的内存
console.dir(obj1); //对象1的名字发生了改变,但是对象2 的名字没有发生改变
console.dir(obj2); // 因为重新开辟了内存
深拷贝---多层复制
//深拷贝---多层复制
var obj1 = {
name: 'zs',
age: 18,
dog: {
name: '金毛',
age: 2
},
friends: ['ls', 'ww']
};
// 深拷贝,把o1的内容拷贝给o2
function deepCopy(o1, o2) {
for (var key in o1) {
var item = o1[key];
//如果是普通的对象是直接
//如果是对象?
if (item instanceof Object) {
o2[key] = {};
deepCopy(item, o2[key]);
}
//如果是数组?
else if (item instanceof Array) {
o2[key] = [];
deepCopy(item, o2[key]);
} else {
o2[key] = item;
}
}
}
var obj2 = {};
deepCopy(obj1, obj2);
obj1.name = 'xx';
obj1.dog.name = 'xxx';
obj1.friends[0] = 'hhh';
console.dir(obj2);
使用递归遍历DOM树:
<h1>遍历DOM树</h1>
<p>可以在遍历的回调函数中任意订制需求</p>
<ul id="list">
<li>11</li>
<li>21</li>
<li>231</li>
</ul>
<div>
<div>
<span>hhh</span>
</div>
</div>
<div id="demo_node">
<ul>
<li>
123
</li>
</ul>
<p>
hello
</p>
<h2>world</h2>
<div>
<p>dsa</p>
<h3>
<span>dadada</span>
</h3>
</div>
</div>
遍历所有的子元素:
//遍历制定元素下的所有子元素
function loadTree(parent) {
for (var i = 0; i < parent.children.length; i++) {
var child = parent.children[i];
console.log(child);
loadTree(child);
}
}
//遍历所有的子元素
loadTree(document.body);
//遍历ul下面的子元素
loadTree(document.getElementById('list'));
//遍历指定元素下的所有子元素
// callback是回调函数
function loadTree(parent, callback) {
for (var i = 0; i < parent.children.length; i++) {
var child = parent.children[i];
// console.log(child);
if (callback) {
//处理找到的子元素
callback(child);
}
//递归调用
loadTree(child);
}
}
var ul = document.getElementById('list');
loadTree(ul, function(element) {
element.onclick = function() {
console.log(this.innerText);
}
})