复杂数据类型深浅拷贝

数据类型

  • 基本数据类型:数据存在栈中,且存储的是各数据类型的值
  • 引用数据类型:该数据类型存在所谓的两种值,内存地址——可以表示为指向对象的指针,存储在栈中; 对象——即各基本数据类型的集合,存储在堆内存中;

赋值

  • 基本数据类型

相对于基本数据类型而言的赋值,单纯将一个变量赋值给另一个变量,实质性是将一个的基本数据类型值从当前存储空间复制,转而将其粘贴到另一个存储空间中。

  • 复杂数据类型
    ①直接将对象所在内存中的地址,赋值给一个变量
var  first = new Object();  //将一个对象的内存地址赋值给一个变量

②将其中一个变量中存储的对象的内存地址赋值给另一个变量

var   first = new Object();
var second = first;         //将一个变量中存储的内存地址赋值给另一个变量,二者存储的都并非是真正的值,而是字符串表示的内存地址

拷贝

拷贝即存在两种方式的赋值,且该仅针对复杂数据类型

浅拷贝

将存储着对象内存地址的变量赋值给另一个变量

var   a = {
"name":'唐三',
"soul":'昊天锤'
};
console.log(a.name);   //唐三`在这里插入代码片`
var b = a;
b.name = '奥斯卡';
console.log(a.name);  //奥斯卡
console.log(b.name);  //奥斯卡

两者变量指向的是同一个内存空间中存储的对象,当其中一个变量对其做出修改时,另一个变量输出的值将会改变

深拷贝

将变量中值指向的对象的值赋值给另一个变量

var   a = {
"name":'唐三',
"soul":'昊天锤'
};
console.log(a.name);   //唐三
var   b ={};
b.name = a.name;
console.log(b.name);   //唐三
b.name = '奥斯卡';
console.log(a.name);   //唐三
console.log(b.name);   //奥斯卡

稍微复杂一点

function setName(obj){        //obj实质上是一个局部变量,第二个变量
    obj.name = "Nicholas";
    obj = new Object();       //该局部变量中的内存地址改变
    obj.name = "Greg";
  }
  var person = new Object();  //声明一个全局变量,值为某个对象的内存地址,第一个变量
  setName(person);
  console.log(person.name);   //"Nicholas"

当存在两个变量,且将其中①号变量的内存地址所指向的对象的值赋值给②号变量时,二者值中的内存地址指向同一个对象,当②号变量中内存地址所指向的对象改变时,修改其对象中属性的值时,①号变量中内存地址所指向的对象其中的值不改变。–逆战班

你可能感兴趣的:(js,javascript)