public class Me的博客

非学无以广才,非志无以成学.

Primitive Types and Reference Types in Javascript

给出翻译原文地址

不得不说,还是阅读国外的技术文章收获大,即使翻译的再好,原著和翻译版的之间的差距是不可消除的,就像水浒传英文版的名字是水边发生的故事一样,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变量中存储的值指向同一个数组,所以通过一个访问修改了数组,通过另一个访问也会发现数组的变化。

阅读更多
文章标签: javascript
个人分类: JavaScript
上一篇理解CSS内联元素的框模型
下一篇sublime快捷键
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭