Primitive Types and Reference Types in Javascript
2017-02-28 16:13
495 查看
给出翻译原文地址
不得不说,还是阅读国外的技术文章收获大,即使翻译的再好,原著和翻译版的之间的差距是不可消除的,就像水浒传英文版的名字是水边发生的故事一样,WTF!
进入正题:
我们经常说变量是用来存储值的,但是这个值是什么值呢?
我们先看看JavaScript中的数据类型,两种数据类型,一是基本类型,二是引用类型。
Numbers, boolean , string,null and undefined 是基本类型,而Objects, arrays, and functions是引用类型。
基本类型本身在内存中有固定大小的的存储空间,但是每一种类型的存储空间大小不一样,例如一个number占据8个字节的内存,一个Boolean值只占据一个字节的内存,number是基本类型中存储字节数最大的(即存储空间最大),所以如果声明变量存储8字节的内存(即是number类型),那么它可以直接装下所有的基本类型。
但是引用类型就是另一回事了,对象可以是任意大小,数组也可以包含任意个元素,函数也可以包含任意行的JavaScript代码,他们可能会占很大内存,所以他们的值不可以直接存储在变量的内存中(是的,每声明一个变量且给这个变量赋值时,都会根据这个变量的类型给它分配相应的内存用来存储变量的值,基本类型的变量都是这样)(这会影响性能),而是在变量中存储了引用(通常这个引用是一种指针或者是内存地址),通过这个引用可以找到存储在堆内存中的引用类型值(对象、函数、数组)。
例子:
变量保存基本类型的实际值,但是只保存引用类型值的引用
以上代码片的重点是:
var b = a ;
这里是变量a中存储的(指向数组的引用)而不是数组本身被传给了变量b,此时变量b 中存储的也是(指向同一个数组的引用),所以a、b变量中存储的值指向同一个数组,所以通过一个访问修改了数组,通过另一个访问也会发现数组的变化。
不得不说,还是阅读国外的技术文章收获大,即使翻译的再好,原著和翻译版的之间的差距是不可消除的,就像水浒传英文版的名字是水边发生的故事一样,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变量中存储的值指向同一个数组,所以通过一个访问修改了数组,通过另一个访问也会发现数组的变化。
相关文章推荐
- CLR Via C# 3rd 阅读摘要 -- Chapter 5 - Primitive, Reference, and Value Types
- 从内部和外部的js文件中获取ASPX页面的控件ClientID(get control reference from inline and external javascript)
- 从内部和外部的js文件中获取ASPX页面的控件ClientID(get control reference from inline and external javascript)
- Type Fundamentals (.NET: Primitive types, reference types and value types )
- CLR.via.Csharp.3rd Chapter 5: Primitive, Reference, and Value Types
- CLR via C# 总结之Chap5 Primitive, Reference, and Value Types
- Primitive, Reference, and Value Types(Chapter 5 of CLR via C#)
- Discussion happned in AskTom about long and LOB types
- Primitive Service Model and Interceptor in HiveMind
- [JavaScript]Event Object in FireFox and IE
- Character types in C and C++
- Distinguish Between Value Types and Reference Types - Effective C#学习笔记(6)
- An Introduction to JavaScript Object Notation (JSON) in JavaScript and .NET
- notice: javascript's by value and by reference
- Sams Teach Yourself Ajax, JavaScript, and PHP All in One
- MooTools Essentials: The Official MooTools Reference for JavaScript™ and Ajax Development
- How to Drag and Drop in JavaScript(怎样通过JavaScript拽动窗口)
- Primitive Service Model and Interceptor in HiveMind
- Using JavaScript in Page Flow and Portal Applications
- Date is a reference type in JavaScript