美文网首页
js/jquery 学习笔记

js/jquery 学习笔记

作者: 夜消雨霁 | 来源:发表于2019-10-24 22:59 被阅读0次

    理解JavaScript中的堆和栈

    这里先说两个概念:1、堆(heap)2、栈(stack)堆 是堆内存的简称。栈 是栈内存的简称。说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事。各种语言在处理堆栈的原理上都大同小异。堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内存空间,并由系统自动释放。javascript的基本类型就5种:Undefined、Null、Boolean、Number和String,它们都是直接按值存储在栈中的,每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。javascript中其他类型的数据被称为引用类型的数据 : 如对象(Object)、数组(Array)、函数(Function) …,它们是通过拷贝和new出来的,这样的数据存储于堆中。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据。说来也是形象,栈,线性结构,后进先出,便于管理。堆,一个混沌,杂乱无章,方便存储和开辟内存空间传值与传址


    vararr1 = [1,2,5,8]; vararr2 = arr1 ; varstr1 = arr1[2];

    console.log(arr2);  //1,2,5,8

    console.log(str1);  //5

    arr2[4] =99; str1 =6;

    console.log(arr1);  //1,2,5,8,99

    console.log(arr1[2]);  //5


    上方例子得知,当我改变arr2中的数据时,arr1中数据也发生了变化,当改变str1的数据值时,arr1却没有发生改变。为什么?这就是传值与传址的区别

    因为arr1是数组,属于引用类型,所以它赋予给arr2的时候传的是栈中的地址(相当于新建了一个不同名“指针”),而不是堆内存中的对象的值。str1得到的是一个基本类型的赋值,因此,str1仅仅是从arr1堆内存中获取了一个数值,并直接保存在栈中。arr1、arr2都指向同一块堆内存,arr2修改的堆内存的时候,也就会影响到arr1,str1是直接在栈中修改,并且不能影响到arr1堆内存中的数据。

    js中深度拷贝和浅拷贝

    对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性


    1、使用递归的方式实现深拷贝

    var obj1 = {

        a : { b : 10 }

    };

    /*function copy(obj){  //浅拷贝

        var newObj = {};

        for(var attr in obj){

            newObj[attr] = obj[attr];

        }

        return newObj;

    }*/

    function deepCopy(obj){  //深拷贝

        var newObj = {};

        if(typeof obj != 'object'){

            //console.trace();

            return obj;

        }

        for(var attr in obj){

            newObj[attr] = deepCopy(obj[attr]);

        }

        //console.trace();

        //console.log(newObj);

        return newObj;

    }

    var obj2 = deepCopy(obj1); //深拷贝

    //第一层循环为  obj2=deepCopy(obj1)----->newObj[a]=deepCopy(obj1[a])=deepCopy({b:10})------->newObj[a]=

     //第二层循环为  newObj[b]=deepCopy({b:10}[b])=deepCopy(10)=10------->newObj[b]=10------->return newObj={b:10}

     //newObj[a]={b:10}------>return newObj=a:{b:10}

    // obj2.a.b = 20;

    alert(obj2.a.b);    //10

    alert(obj1.a.b);  //10


    2、通过 JSON 对象实现深拷贝

    //通过js的内置对象JSON来进行数组对象的深拷贝

    function deepClone(obj) {

        var _obj = JSON.stringify(obj),

               objClone = JSON.parse(_obj);

        return objClone;

    }  

    deepClone(myobj);

    3、通过jQuery的extend方法实现深拷贝

    var array = [1,2,3,4];var newArray = $.extend(true,[],array);

    其它插件、库提供的方法等等

    相关文章

      网友评论

          本文标题:js/jquery 学习笔记

          本文链接:https://www.haomeiwen.com/subject/xgbyhftx.html