首先认识JS的数据类型

大致分为两种:基本数据类型和引用数据类型

其中:

(1)基本数据类型:数值、字符串、布尔、null、undefined(基本类型)

(2)复杂数据类型:对象(引用类型)

保存上的区分:

  基本数据类型保存在栈内存中,而引用elixir保存在堆内存中。

  根本原因保存于栈内存必须是大小固定的数据,引用类型的大小不固定,只能保存在

在堆内存中,但是可以把它的地址写在栈内存中以供我们访问

举例:

var a = 1;//定义了一个number类型
var obj1 = {//定义了一个object类型
    name:'obj'
};

   基本数据类型:按值访问,操作的就是变量保存的值

   引用类型:只是通过保存在变量中的引用类型的地址来操作实际对象。

   如图:

 

 

 1、基本数据类型的复制

var a = 1;
var b = a;//复制
console.log(b)//1
a = 2;//改变a的值
console.log(b)//1

  赋值的时候,在栈内存中重新开辟内存,存放变量b,所以在栈内存中分别存放着变量a、b各自的值,修改时互不影响。

 

 2、引用类型的复制

var list1 = ['123','456'];
var list2 = list1;//复制
console.log(list2)//['123','456'];
color1.push('789') ;//改变list1的值
console.log(list2)//['123','456','789']

  list1与list2指向堆内存中同一地址的同一对象,复制的只是引用地址。

 

深拷贝:

 

JSON.parse(JSON.stringify(obj))

 

  利用JSON.stringify(obj)将对象先转为json字符串,再JSON.parse()转回为json对象可以实现深拷贝,这也是比较常用的一种方法。

 

用js实现一个深拷贝

其实深拷贝可以拆分成 2 步,浅拷贝 + 递归,浅拷贝时判断属性值是否是对象,如果是对象就进行递归操作,两个一结合就实现了深拷贝。

function cloneDeep(source) {
      if (!isObject(source)) return source; // 非对象返回自身
      var target = Array.isArray(source) ? [] : {};
      for (var key in source) {
        if (source.hasOwnProperty(i)) {
          if (isObject(source[key])) {
            target[key] = cloneDeep(source[key]); // 注意这里
          } else {
            target[key] = source[key];
          }
        }
      }
      return target;
    }
    function isObject(obj) {
      return typeof obj === 'object' && obj != null;
    }

  

 

 posted on 2020-05-13 00:57  CorgiSYJ  阅读(183)  评论(0编辑  收藏  举报