js数组引用数据类型分析。
最近在看python的in比较运算符有所联想。仔细分析下引用数据类型和值数据类型。
先来看几个例子。
var a=[1,2];
var b=[1,2];
if(a==b){alert(true)}
else{alert(false)}
FALSE。
var a='a';
var b='a';
if(a==b){alert(true)}
else{alert(false)}
TRUE。
为啥两个值会不一样呢,因为JS中数组是引用数据类型,字符串是值数据类型。
a=[1,2]可以理解为在计算机内存中创建了[1,2]这个值,而a作为他的引用名存在。
接下来b又在内存中创建了另一个[1,2]的值。
a和b所指向的并不是同一个东西。所以当他们比较时,计算机理解为两者不相等。
而字符串是值数据类型,可以理解为在内存中创建了a这个变量,把"a"这个值赋值给了a,b的创建也相同,
而当他们比较时,计算机会把两者的值相比较,两个值都是"a",所以理解为相等,弹出false。
一个朋友把他们的关系理解成存折和现金。
引用数据类型为存折,即使你们存折里的钱是一样的,但是能说存折是一样的吗?
值数据类型为现金,大家一样有1元硬币,互相交换一下都可以,因为他们的价值是一样的。
再来看个例子。
var a=[1,2];
var b=a;
b[1]="a";
if(a==b){alert(true)}
else{alert(false)}
大家肯定能猜出来了。是TRUE。
因为a和b指向的是同一个数据[1,2],当用b改变数据中的值以后,再用a去提取这个数据,数据仍旧是一样的。
这时就会有另一个问题,比如说即使给a和b同时赋null的值,内存中数组[1,2]还是存在的,因为仅仅是引用值改变了。
不必担心其实任何一种浏览器都有垃圾处理机制,这种数据会直接当垃圾处理掉的。