基础值和引用值及他们之间的区别

138 阅读2分钟

    一些基础的底层知识

1.原始值包括哪些

    原始值即一些代表原始数据类型的值,也叫基本数据类型,js中的原始值有:Number,String,Boolean,Null,Undefined这些基本数据类型。原始值存储在栈中。

2.引用值包括哪些

     引用值是指一些复合类型数据的值,包括Object,function,Array,RegExp,Data,

3.栈内存和堆内存以及区别

  :栈会自动分配内存空间,物理内存是连续的,存放基本类型,简单的数据段, 占据固定  大小的空间。 

         基本类型:String,Number,Boolean,Null,Undefined 

 堆: 动态分配的内存,物理地址不连续,大小不定也不会自动释放,存放引用类型, 指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针。 

         引用类型:Function,Array,Object 


4.原始值和引用值的区别


当一个原始变量值赋给另一个原始变量时,只将栈中的内容复制给另一个原始变量,此时这两个变量互不影响,即当一个变量值改变时,另一个变量不会受此影响,两个变量互不干系。

var num1 = 3; // num1 == 3
var num2;     // num2 == undefined
num2 = num1;  // num1 == num2 == 3
num1 = 4;     // num1 = 4; num2 = 3 


引用值于原始值不同,引用值把引用变量存储在栈中,而实际的对象存储在堆中。每一个引用变量都有一根指针指向其堆中的实际对象。

var num1 = [1,2,3];
var num2;
num2 = num1;
console.log(num1,num2); // num1 == num2 == [1,2,3]
num2.push(4);
console.log(num1,num2); // num1 == num2 == [1,2,3,4]
num2 = [6,7];
console.log(num1,num2); // num1 == [1,2,3,4], num2 == [6,7]

由上述代码可以看出,num1和num2各自的变量名存在栈中,而他们都指向堆中的同一个地址(实际值),当通过方法方式改变值时仅是改变堆中的内容,因此num1,num2皆改变。当num2通过非方法改变值时,系统会为变量创建一个堆空间,此时,num2的指针指向新的堆地址,num1,num2值不相同。