基本类型和引用类型_深拷贝和浅拷贝

ECMAScript 变量 __ 包含 _____ 的值:
A.只能;一种数据类型
B.可能;两种不同数据类型
C.可能;三种不同数据类型

(答案见文末)

定义:

  按值访问:

    Undefined、Null、Boolean、Number、String这五种基本数据类型是按值访问的,因为可以操作保存在变量中实际的值。

  按引用访问:

    var obj = {name : 'Diana'};

    要访问对象,须通过obj这个引用(指针)去寻找这个对象。

  按值传递:

    传递的是值的拷贝,也就是说传递后就互不相关了。

  按引用传递:

    传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

  

基本类型的复制:

  var a = 5;

  var b = a;

  b = 6;

  console.log(a); //5


引用类型的复制:

  var obj_a = {
    name:'Diana'
  };

  var obj_b = obj_a;

  obj_b.name = 'Apollo';

  console.log(obj_a.name); // 'Apollo'


造成以上结果的原因:

  引用类型的变量,包含的是指针(引用)。当var obj_b = obj_a时,两个变量为指向同一对象的指针(引用)。

  所以当obj_b.name = 'Apollo'时,操作的实际上是两个变量共同指向的那个对象。

  

-----------------------------------------------------------------分割线-------------------------------------------------------------------------------

那么,作为函数的参数,基本类型和引用类型是如何表现的呢?

  答:ECMAScript中所有的函数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

  疑问:如果参数使用的是对象呢。也是按值传递吗?

  答:是的,只不过这个"值" 是 指针。

深拷贝VS浅拷贝:

  按值访问的数据类型,在拷贝的时候会完整复制一份,拷贝之后就互不相关了。

  按引用访问的数据类型,在拷贝的时候复制的是引用,当原对象发生变化时,拷贝对象也会发生变化。


let obj1 = { a: 1, b: 2}; let obj2 = { ...obj1, b: '2-edited'}; console.log(obj1); // {a: 1, b: 2} console.log(obj2); // {a: 1, b: "2-edited"}

  由以上代码可以看出,...运算符对基本数据类型复制之后,改变拷贝对象,不会对原对象造成影响

let obj1 = {a:1, b:{name:'Diana'}};
let obj2 = {...obj1};


obj2.a = 2;
obj2.b.name = 'Apollo';

console.log(obj1); 
//{ a: 1, b: { name: 'Apollo' } }
console.log(obj2); 
//{ a: 2, b: { name: 'Apollo' } }

  由以上代码可以看出,拷贝后的对象,修改其name属性,对原对象也会由影响。

  由此可以发现,...运算符是一种浅拷贝。

  由上图可见,...运算符在复制对象时,是对象的引用(指针) 。而基本类型,本来就是复制的值。

正确答案:B



猜你喜欢

转载自www.cnblogs.com/oy-lee/p/11668671.html
今日推荐