zoukankan      html  css  js  c++  java
  • js 数组引用 发现的问题

    最近做项目时,要对返回的数据[保存在json数组中]做一次修改,但原数据要保留一次做备用。首先想到,原数据不动,用一个临时的变量来修改,大致模型就是这样:

    // 原始:
    
    a=[1,2,3,4,5,.........];
    
    // 临时:
    
    var b = a ;
    
    // 操作:
    
    b[b.length] = 1 ;

    本来觉得是一个很简单的问题。但测试时候发现,并没得到想要的结果。测了很久才找到问题:a数据居然也跟着b的操作一起发生了改变,怎么都想不通。问了同事,貌似他没遇到过,也搞不清楚怎么回事。只好求助网络查询。查到了一个跟我相似的问题。

    其中有这样一个例子:

    <script>   
      var a=[1,2,3,4];
        //例子1
       var b=a;
           alert(a);   //1234
           alert(b);   //1234
     //例子2
      var c=a;
          c[3]=5;
          alert(c);   //1235
          alert(a);   //1235
     //例子3
      var d=a[1];
          d=10;
          alert(a);   //1234
    </script>
        
    //结论:数组对数组是引用类型,数组对变量是值类型

    其中一个仁兄给出了解释:

    JS中没有指针,只有传值(value)与传址(reference引用)的区别

    var a = [1,2,3,4]   //a不仅是数组,还是个对象,实际上a就是对[1,2,3,4]的引用
    var b=a 
    var c=a
               //以上两条赋值语句建立了b与c 对a即[1,2,3,4]的引用,无论改变a 还是b抑或c 都是对[1,2,3,4]的操作,这就是传址(堆中操作)

    var d=a[1]      //则是把a[1]的值"1"传递给d,对d的改变则不会影响a[1],即所谓的传值(栈中操作)

     这才有点明白。还是用原文的结论:

     js数组是引用类型,它只允许通过索引来获取或改变数组的值 引用类型的东西都是不能通过(它赋值过的外部变量)所改变的  也就是(它赋值过的外部变量)这个值改变了原数组不会有任何变化

    原文点这里

  • 相关阅读:
    多个相同结构的表的字段的修改、添加
    SQL SERVER 查询去重 PARTITION BY
    message from server: "Host 'xxx' is not allowed to connect to th
    jdk 1.8 连接数据库
    恢复SQLServer数据库后,如何同步登陆名和用户名
    无法识别的属性“targetFramework”。请注意属性名称区分大小写。错误解决办法
    jquery.tablesorter 使用
    MD5加密
    C# 判断是否是节假日
    word ladder
  • 原文地址:https://www.cnblogs.com/wsun/p/3993902.html
Copyright © 2011-2022 走看看