递归以及深拷贝和浅拷贝

目录

递归

数组操作-forEach()

数组操作-some()

数组操作-filter()

递归的应用(一)

递归的应用(二)

浅拷贝

深拷贝

案例:深拷贝一个对象


递归

  • 函数内部自己调用自己
  • 递归函数必须有退出条件,否则会造成栈溢出

数组操作-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
  • 效率最高!

注意

扫描二维码关注公众号,回复: 13163575 查看本文章
  1. 查找的时候,查找到这个元素,就不再继续往后查找,直接返回结果
  2. 如果查到第一个满足条件的元素,则终止循环,不再查找

  3. 与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);

猜你喜欢

转载自blog.csdn.net/lucky_ferry/article/details/119114226