JavaScript变量赋值:基本类型变量赋值 VS 引用类型变量赋值
Author:[email protected] Date:
变量赋值
基本类型变量赋值
var a = "apple"; var b = a; a = "banana";
此时,a 值为banana b值为apple
引用类型变量赋值
var a = {name: "apple"}; var b = a; a.name = "banana"; b.name//banana
此时,a.name 值为 banana; b.name 值为banana
变量取值引用类型的值
var a = {name: "apple"}; var b = a.name; b= "banana"; a.name//apple
这个要从ECMAScript的变量值类型说起~
类型共有两种:
基本类型 (primitive values) - 包括Undefined, Null, Boolean, Number和String五种基本数据类型
引用类型 (reference values) - 保存在内存中的对象们,不能直接操作,只能通过保存在变量中的地址引用对其进行操作
现在回来看第一个例子例1.1
"apple"是String类型,属于基本类型,这时值是这样储存的:
这时a的值被copy了一份赋给了b:
所以,从此a和b井水不犯河水,各自怎么修改都不会影响对方了~
再来看第二个例子例1.2
{name: "apple"}是一个Object,属于引用类型,赋值前后值是这样存储的:
所以当a.name = "banana";时,修改的是大家共同指向的内存中的object的属性值,所以b.name的值也就跟着变了。
例1.3中
var a = {name: "apple"}; var b = a; a = {name: "banana"}; // {name: "banana"} 是内存中的一个新的Object了, // a变量存储的地址也是指向这个新的Object的了,所以和b又无关了 b.name //还是"apple"
例1.4中
var a = {count: 2}; var b = a.count; // a.count是Number类型,所以值被copy给b, // 从此再怎么修改与b无关了 a.count = 3; b //还是2
小总结,变量赋值时总是会copy一份的,如果是基本类型,copy的就是实际的值,如果是引用类型,copy的是指向Object的地址值,所以指向的还是同一个Object。
变量比较
对于基本类型,比较的就是实际的值,而对于引用类型(Array也是一种Object),比较的是地址值,虽然两个数组内容是一样的,但它们在内存中是两个Object,地址是不一样,所以比较的结果是false。
转载本站文章《JavaScript变量赋值:基本类型变量赋值 VS 引用类型变量赋值》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/js/2015_1111_348.html