JS 基础类型 与 引用类型的区别
什么是引用类型:
引用类型是值无法直接保存在本地变量中,而是通变量保存“地址值“地址值引用存储数据的数据体。
为什么:
因为js中规定一个变量名只能存储一个值,而如,数组,函数,对象,都因为js规定,所以无法直接存储在本地,只能另开辟一个存储空间,来存储,数组体,函数体,对象体,在通过“地址值“保存在本地变量中。本地变量引用——开辟的存储空间。
验证:
ex:
var arr=[1,2,3,4,2,5];
var arr2=arr;
arr==arr2 => true
ex:
var arr=[];
var arr2=[];
arr==arr2 => false
所以可以通过以上例子验证出,arr中和arr2中保存的是地址值,两 者相比较的不是直接的数组值, 而比较的是各自保存在变量本地的地址值
什么是基础类型:
值直接存储在本地变量中的数据
根据引用类型和基础类型拓展的赋值问题
ex:var arr=[5,6,3,4,5];
var arr2=arr;
arr2[0]--;
arr[0]=>4;
arr2[0]=>4;
arr[1]++;
arr2[1]=>7;
arr[1]=>7;
① var arr="地址值"
② var arr2=arr;//arr将存储在本地的地址值复制一份副本给arr2
//此时arr2中保存的是和arr同一个地址值
//此时arr和arr2同时引用着[5,6,3,4,5];
③ arr2[0]--; //此时修改数组元素,修改的都是同一个数组体
④ arr[0] => 4
⑤ arr2[0] => 4
⑥ arr[1]++;
⑦ arr[1] => 7
⑧ arr2[1] =>7 //arr2和arr不论如何修改都是修改同一个数组
基础类型赋值
ex:
var str="String";
var str2=str;
str="修改值";
str2 => "String";
str => "修改值";
① var str="String";//声明一个变量值直接保存在变量地
② var str2=str;//将str的值复制一份副本给str2
③ str="修改值";//将str的值修改
④ str2=> "String"
⑤ str => "修改值"
在str2=str时,引擎将str存储在本地变量中的值复制副本一份给了str2,所以此时在内存中str的值存在两份,所以声明后修改任何一方都不会影响到对方,因为他们从始至终修改的都是各自在本地变量中的值,所以不会影响到对方。
总结:
引用类型:值无法保存在变量本地,而是另行开辟一个空间存储其中值,在arr=arr2赋值时只是将arr2中的地址复制一份副本给arr,并不是将整个存储空间中的值复制一份给arr,只是将引用存储空间的地址复制一份给了arr,所以arr和arr2同时引用着同一个存储存储空间中的值,不管任何一方修改都会影响到对方,因为arr 和 arr2从始至终都引用的是同一个存储空间的值。
基础类型:值直接保存在变量本地,在 str2=str; 赋值时是将str中的值复制一份副本给了str2,所以此时内存中存在两份str的值,所以修改任何一方都不会影响到对方。