不得不说,还是阅读国外的技术文章收获大,即使翻译的再好,原著和翻译版的之间的差距是不可消除的,就像水浒传英文版的名字是水边发生的故事一样,WTF!
进入正题:
我们经常说变量是用来存储值的,但是这个值是什么值呢?
我们先看看JavaScript中的数据类型,两种数据类型,一是基本类型,二是引用类型。
Numbers, boolean , string,null and undefined 是基本类型,而Objects, arrays, and functions是引用类型。
基本类型本身在内存中有固定大小的的存储空间,但是每一种类型的存储空间大小不一样,例如一个number占据8个字节的内存,一个Boolean值只占据一个字节的内存,number是基本类型中存储字节数最大的(即存储空间最大),所以如果声明变量存储8字节的内存(即是number类型),那么它可以直接装下所有的基本类型。
但是引用类型就是另一回事了,对象可以是任意大小,数组也可以包含任意个元素,函数也可以包含任意行的JavaScript代码,他们可能会占很大内存,所以他们的值不可以直接存储在变量的内存中(是的,每声明一个变量且给这个变量赋值时,都会根据这个变量的类型给它分配相应的内存用来存储变量的值,基本类型的变量都是这样)(这会影响性能),而是在变量中存储了引用(通常这个引用是一种指针或者是内存地址),通过这个引用可以找到存储在堆内存中的引用类型值(对象、函数、数组)。
例子:
//基本类型
var a = 3.14; // 声明并初始化一个变量a ,a存储一个基本类型值
var b = a; // 复制变量的值给新的变量,此时a中的值和b中的值是相互独立的
a = 4; // 修改变量的值
alert(b) // 显示3.14,因为复制的值没有被改变
变量保存基本类型的实际值,但是只保存引用类型值的引用
//引用类型(以数组举例)
var a = [1,2,3]; // 使用一个数组初始化一个变量a,a存储一个引用类型值
var b = a; // 复制a中的引用给新的变量b
a[0] = 99; //使用原始引用修改数组
alert(b); // 使用新的引用展示数组,发现数组已经变化了
以上代码片的重点是:
var b = a ;
这里是变量a中存储的(指向数组的引用)而不是数组本身被传给了变量b,此时变量b 中存储的也是(指向同一个数组的引用),所以a、b变量中存储的值指向同一个数组,所以通过一个访问修改了数组,通过另一个访问也会发现数组的变化。