一些基础的底层知识
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值不相同。