写代码就不开心 2021-02-22 18:45 采纳率: 33.3%
浏览 609
已结题

js 函数里面对数组进行赋值,不会改变原数组?

输出还是 [1,2,3] 是怎么回事

        let arr = [1,2,3];

        change(arr);

        console.log(arr); //  [1,2,3]

        function change (arr){
            arr = [];
        }
  • 写回答

3条回答 默认 最新

  • 天际的海浪 2021-02-22 22:18
    关注

    举例说明吧

    var a = [1,2,3]; //a中存储的是数组的引用地址,这个数组我起名叫“数组1”
    var b = a; // a赋值给b,b中也存储了“数组1”的引用地址

    b[1] = 4; // 对 b[1] 赋值并不是直接改变b中存储的内容,而是读取b中存储的引用地址,通过这个引用地址找到“数组1”,再对“数组1”的[1]属性进行赋值。
    //这样对b本身而言只是读取操作,b中存储的内容没有改变,依然与a中存储的引用地址一样。

    //同样的
    b.push(5); // 也是先读取b中存储的引用地址,通过这个引用地址找到“数组1”,再调用“数组1”的push方法对“数组1”中的属性添加。
    //这样对b本身而言也只是读取操作,b中存储的内容没有改变,依然与a中存储的引用地址一样。


    //但下面就不同了
    b = [7,8,9]; //将一个新的数组赋值给b,这个新的数组我起名叫“数组2”
    // 这回对b本身而言就是写入操作了,b中存储的内容变成“数组2”的引用地址。
    // 但是a中存储的引用地址没有变,还是原来存储的“数组1”的引用地址。
    // 这样a和b的关联就断开了。
     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月27日

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同