zoukankan      html  css  js  c++  java
  • javascript对象引用与赋值

    avascript对象引用与赋值

    <script type="text/javascript">

    //例子一: 引用

    var myArrayRef = new Array(0,1,2); //创建数组对象

    var mySeconArrayRef = myArrayRef; // 对象复制.

    myArrayRef[0] = 100; // 修改元素值

    alert(mySeconArrayRef[0]);

    /**

    * 输出 100; 学过其它语言的都应该知道这里应该输出的是0 为什么输出的是100呢?

    * 上面程序通过把myArrayRef对象复制给了mySeconArrayRef这时就存在了2个独立的 但最初值是相同的对象

    * 因为是独立的为什么修改myArrayRef会对别一个对象有影响呢?大家都知道只有当他们引用的是同一个对象时这时修改一个才会

    * 对别一个产生影响.但是在javascript语言中创建的对象myArrayRef值中其时保存的是对象的引用(也就是一个地址).

    * 也就是 我用 new Array生成的保存在内存中而new Array把它所在的地方告诉了myArrayRef,myArrayRef又把这地址告诉了mySeconArrayRef

    * 他们两个都指向的是new Array生成对象的地址而不是把对象保存在myArrayRef中,所以通过其中的一个去修改值时其时是修改他们同指象的那对象.

    */

    alert(mySeconArrayRef[0] );

    //例子二: 赋值

    var myVa = 'ABC'; //把ABC的值 赋予了myVa

    var myVb = myVa; // myVa 赋值给 myVb

    myVa = 'DEF'; //修改myVa

    /**

    * 输出的是:ABC. 因为是把值保存在了变量了 而不是保存的是引用地址,所以他们两个是相对独立的整体.

    */

    alert(myVb);

    </script>

    如果真要复制对象互不影响,则要通过转换赋值或者遍历key:value来复制你中的方法和属性。

    注意:对象的子对象也是引用,所以遍历赋值的时候要判断,子元素是否是对象,如果子元素是对象,则继续对子元素进行遍历赋值。
    转换赋值方式:

    var data = {a:1,b:2,c:3,d:[0,1,2,3]};
    var str = JSON.stringify(data);
    var data1 = $.parseJSON(str); //$为jQuery对象需要引入jQuery包
    data1["e"] = 4;
    data1["d"][0] = 11;
    console.log(data);
    console.log(data1);

    输出结果:
    {a: 1, b: 2, c: 3, d: [0,1,2,3]}
    {a: 1, b: 2, c: 3, d: [11,1,2,3], e: 4}

    相互没有影响

    当对象引用做为函数参数传递时候,依然会相互影响,切记,如下示例:
    var data = {a:1,b:2,c:3,d:{q:4,w:5,e:6}};
    var data1 = data;
    function con(data2){
    data2["r"] = 5;
    console.log(JSON.stringify(data2));
    }
    con(data1);
    console.log(JSON.stringify(data));

    输出结果:

    {"a":1,"b":2,"c":3,"d":{"q":4,"w":5,"e":6},"r":5}
    {"a":1,"b":2,"c":3,"d":{"q":4,"w":5,"e":6},"r":5}
     
    对象引用赋值后,如果将对象置空,相互间是不受影响的,如下:
    var arr = {"a":"1","b":"2"};
    var arr1 = arr;
    arr = {};
    arr["a"] = 2;
    console.log(arr1);
    console.log(arr);

    输出结果:{"a":"1","b":"2"},{"a":2}

  • 相关阅读:
    【代码片段】HTML5嵌入媒体 (HTML5 Embedded Media)
    【代码片端】@Font-Face
    【代码片段】CSS3 渐变(CSS3 Gradients)
    【代码片段】CSS RESET,支持HTML5
    我的Cocos2d-x学习笔记(九)游戏帧循环(游戏主循环)
    我的Cocos2d-x学习笔记(八)利用CCSpriteBatchNode进行优化
    我的Cocos2d-x学习笔记(七)纹理缓存、帧缓存、精灵的创建、zOrder
    我的Cocos2d-x学习笔记(六)坐标体系与锚点
    我的Cocos2d-x学习笔记(五)CCLayer、CCLayerColor、CCLayerGradient、CCLayerMultiplex
    我的Cocos2d-x学习笔记(四)场景转换特效
  • 原文地址:https://www.cnblogs.com/xiaxianfei/p/5884159.html
Copyright © 2011-2022 走看看