ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

拷贝

2022-08-06 20:35:27  阅读:187  来源: 互联网

标签:console name car2 car1 car4 拷贝 log


拷贝

内存中有栈内存和堆内存。

栈(操作系统)︰由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;

堆(操作系统)∶存储复杂类型对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。

原始数据类型存储在栈内,引用数据类型存储在堆内,地址在栈

 

 

案例
      function Person(name) {
          this.name = name;
      }
      function f1(x) { // x = p
          console.log(x.name); // 2.这个输出什么 ?刘德华
          x.name = "张学友";
          console.log(x.name); // 3.这个输出什么 ? 张学友
      }
      var p = new Person('刘德华');
      console.log(p.name); // 1.这个输出什么 ? 刘德华
      f1(p);
      console.log(p.name); // 4.这个输出什么 ? 张学友

 

浅拷贝

引用数据类型中拷贝内存地址的方式叫浅拷贝。

    var car1 = {name:"car1",type:"type1"}  // 00111
  var car2 = car1; // 00111
  var car3 = car1;
  car2.name = "car2"; //修改的是00111这个内存地址所存储的对象
  console.log("car1:",car1); // {name:"car2",type:"type1"}
  console.log("car2:",car2); // {name:"car2",type:"type1"}
  console.log("car3",car3); // {name:"car2",type:"type1"}
   
  //引用数据类型是比较的内存地址,相同内存地址为true,不相同为false
  console.log(car1 === car2) //true
深拷贝

数据的深拷贝,创建一个新的内存地址拷贝数据

    var car4 = {} // 创建一个对象,会在堆内存里面开辟一个新的内存地址
   
  //拷贝car1的内容到car4
  Object.keys(car1).forEach(function(item){ // item是遍历对象的属性名
    car4[item] = car1[item];
  })
   
  console.log(car4); //{name:"car2",type:"type1"}
  car4.name = "car4";   //修改car4的值不会影响car1,因为两者指向不同的内存地址
  console.log("car4:",car4)   //{name:"car4",type:"type1"}
  console.log("car1", car1); //{name:"car2",type:"type1"}

封装的函数

  function deepCopy(data) {  //递归  数据的深拷贝
    if (typeof data != "object") {
      return data;
    }
    else if (Array.isArray(data)) {
      var arr = [];
      data.forEach(function (o) {
        // data是数组,数组的元素可以是任意的类型,需要调用递归函数再次判断,直到找到非obj的类型
        arr.push(deepCopy(o));
      })
      return arr;
    }
    else if (typeof (data) === "object") {
      var obj = {}
      Object.keys(data).forEach(function (i) {
        // data是对象,对象的元素可以是任意的类型,需要调用递归函数再次判断,直到找到非obj的类型
        obj[i] = deepCopy(data[i]);
      })
      return obj;
    }
  }
  var obj2 = deepCopy(person1);
 

标签:console,name,car2,car1,car4,拷贝,log
来源: https://www.cnblogs.com/nomnom/p/16557799.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有