目录
递归
- 函数内部自己调用自己
- 递归函数必须有退出条件,否则会造成栈溢出
数组操作-forEach()
- 迭代遍历数组(加强版的for循环遍历)
- 用法:arry.forEach ( function(value, index, arr ) ) 其中 value 是数组里面的值,index 是该值的索引号
- 一句话:遍历该数组,得到值,对其进行操作
// 用forEach遍历数组并求数组之和
var arr = [12,3,34,9];
var sum =0;
arr.forEach(function(value,index){
sum+= value;
})
console.log(sum);
数组操作-some()
- 查找数组中是否有指定的元素
- 返回布尔值,有就true,没有就false
- 效率最高!
注意:
- 查找的时候,查找到这个元素,就不再继续往后查找,直接返回结果
-
如果查到第一个满足条件的元素,则终止循环,不再查找
-
与forEach 的区别在于: forEach 会遍历完所有的元素;而some 找到就终止循环,后面的元素不管;
// 查找数组中是否有指定元素
var arr = ['red','blue','black','pink'];
var flag = arr.some(function(value,index){
return value == 'blue';
})
console.log(flag);
数组操作-filter()
- 遍历数组
- 筛选出符合条件的元素
- 以新数组的形式返回
// 遍历数组找出数组中为偶数的元素
var arr = [12,5,76,34,13]
var newArr = arr.filter(function(value,index){
return value % 2==0;
})
console.log(newArr)
递归的应用(一)
// 求n 的阶乘
function fn(n){
if(n == 1){
return 1;
}
else{
return n * fn(n-1);
}
}
fn(10); // 10的阶乘
// 求斐波那契数列 特点:知道前两项就可以求出这一项
function fb(n) {
if (n == 1 || n == 2) {
return 1;
}
return fb(n - 1) + fb(n - 2);
}
console.log(fb(6)); // 第6项
递归的应用(二)
商品的分类:N级分类, 一级分类、二级分类。。。我们想要根据 id 值就得到这个商品的所有信息,
// 有一个数组,里面存放了两类东西,家电和服饰;家电里包含冰箱和洗衣机
var data = [{
id: 1,
name: '家电',
goods: [{
id: 11,
gname: '冰箱',
}, {
id: 12,
gname: '洗衣机'
}]
},
{
id: 2,
name: '服饰'
}];
//封装成一个函数
function getID (json,id){
json.forEach(function(item){
if(item.id == id){
return item;
}
else if(item.goods && item.goods.length >0){
getID(item.goods,id);
// 这里就是用到了递归,但是调用这个getID时,我们查找的数组是 item.good 也就是里面的二级分类
}
})
}
getID(data,1);
getID(data,12);
浅拷贝
-
浅拷贝只是拷贝最外面的一层,更深层次对象级别的只拷贝引用
首先我们需要理解的就是基本数据类型,和引用数据类型
- 在内存中分为几个区,其中有栈和堆;
- 栈中存放的是基本数据类型,它的变量和值都直接存在这里面;而引用数据类型,比如构造函数等,栈中只是存放了它的地址(一般是以十六进制形式),它真实的数据其实是在堆中;
- 浅拷贝只是拷贝了基本数据类型以及引用类型的地址;
- 由于只拷贝了引用类型的地址,没有数据,拷贝不够深入,因此称为浅拷贝;
用法:
Object.assign(target, object) 第一个是拷贝目标,第二个是被拷贝目标;
- 由于只拷贝了引用类型的地址,如果我们改变了拷贝对象中的值,原来的值也会发生变化;因为这个地址和原对象中的地址指向的是同一个地址,
深拷贝
- 拷贝的基本数据类型以及引用类型,这个不再是地址了,而是在堆中重新开辟一个内存,复制了原来引用类型的真实数据;
- 所以如果我们改变拷贝对象中的值,对原来的对象不会产生任何影响。
案例:深拷贝一个对象
var obj = {
id: 13,
name:'andy',
msg :{
age:10;
}
};
var o = {};// o是拷贝结果
function deepCopy(newobj,oldobj){
// 首先我们要获取拷贝对象中的属性和属性值
for(var k in oldobj){
var item = oldobj[k];
// 判断数据类型
if (item instanceof Array){
newobj[k] = [];
deepCopy(newobj[k],item);
}
else if (item instanceof Object){
newobj[k] = [];
deepCopy(newobj[k],item);
}
else{
// 属于简单数据类型
newobj[k] = item;
}
}
}
deepCopy(o.obj);
console.log(o);