基本数据类型与引用数据类型的区别

  基本数据类型

存放在栈内存中的简单数据段,数据大小确定,内存大小空间可以分配。

基本数据类型有Number、String、Boolean、Undefined、Null

var a = 1;
var b = a;
var b = 2;
console.log(a);   //1
console.log(b);   //2

这个例子,相当于b只是a复制粘贴后的一个副本,对b的操作不会影响a的值。下图是该过程的示意图:

                           


引用数据类型

存放在堆内存中的对象的值,由地址指针组成,地址保存在栈内存中,值保存在堆内存中。堆内存中的内个空间大小不一样。当我们访问引用类型的值时,需要先从栈中获取该对象的指针,然后再从堆内存中获取所需的值。

不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈内存中的引用地址。

引用数据类型有对象、数组、函数

var obj1 = new Object();
var obj2 = obj1;
obj2.name = 'xpf';
console.log(obj1.name);  //xpf

这个例子,同样obj2 是 obj1的一个副本,但是不同的是,obj1与obj2的引用地址指向的是同一个堆内存对象。而 obj2.name = 'xpf';  的意思就是通过引用地址,给这个引用地址所指向的堆内存中的对象Object添加了一个值为xpf的name属性,此时再输出obj1.name,就是获取堆内存中的对象object中的name属性,即xpf。下图是该过程的示意图:

                                       



总结:

  • 声明变量时不同的内存分配: 

  1)基本类型值:存储在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置

  2)引用类型值:存储在堆中的对象,也就是说,存储在变量处的值是一个指针,指向存储对象的内存地址。

     因为:引用类型值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。

  • 不同的内存分配机制也带来了不同的访问机制

  1)在javascript中不允许直接访问保存在堆内存中的对象。

  2)而基本类型的值则是可以直接访问到的。

  • 复制变量时的不同

  1)基本类型值:将一个变量复制给另一个变量时,此后这两个变量是完全独立的,他们只是拥有相同的value而已。

  2)引用类型值:将一个变量复制给另一个变量时,会把这个内存地址赋值给新变量,

    也就是说这两个变量都有一个指向堆内存中同一个对象的指针,他们中任何一个作出的改变都会反映在另一个身上。

       复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个指针。

  • 参数传递的不同(把实参复制给形参的过程

  首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。

  1)基本类型值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。

  2)引用类型值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!

     因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。



参考博客:https://www.cnblogs.com/cxying93/p/6106469.html

写在最后:如果还是不理解上面说的,可以这样来

基本数据类型,复制后,两个变量就再无关系,互不影响;

引用数据类型,复制后,对其中一个的操作都会影响到另一个变量。

                        ---------------本文完---------------

猜你喜欢

转载自blog.csdn.net/qq_42720683/article/details/88287445