Primitive Types and Reference Types in Javascript

翻译 2017年02月28日 16:13:12

给出翻译原文地址

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

no match for ‘operator=’ 等号两端 不匹配

const auto new_states = state_extend_function(word,dict,visited,end);unordered_set::iterator itv; fo...
  • hzw05103020
  • hzw05103020
  • 2016年04月14日 17:26
  • 6207

codeblocks使用cppcheck检查代码

cppcheck是一个静态代码检查工具,能够根据代码分析一些可行的优化方向,但是并不是完全准确,不是完全准确,不是完全准确,重要的事情所以需要说三次。 cppcheck是一个可以单独使用的工具,存在...
  • u010953266
  • u010953266
  • 2015年09月23日 17:23
  • 1203

Swift的自动引用计数->解决内存泄露

Swift的自动引用计数->解决内存泄露 在swift中的变量一般分为三种: 1、          strong 强引用  默认 2、          weak  弱引用  定义时前面加 we...
  • qq_14920635
  • qq_14920635
  • 2016年05月24日 12:05
  • 2080

Oracle Database PLSQL Packages and Types Reference 12c

  • 2017年08月28日 14:34
  • 28.07MB
  • 下载

undefined reference to错误 和ORA-06553: PLS-306: wrong number or types of arguments in call to "OGC_X"

项目中遇到的两个错误: 1.undefined reference to错误 首先确认你的变量名字是否正确的,包括大小写检查。 由于新添加了日志动态链接库 先前的项目中,用到了一个数据...
  • zx824
  • zx824
  • 2011年09月21日 16:23
  • 4572

Kotlin Reference (三) Basic Types, String, Array and Imports

关于2、10、16进制; 使用下划线在数值常量赋值数据中; 使用`==`和`===`进行比较; 基本数据类型间的类型转换方法toXxx; 位移操作; 字符,转义符...
  • jjwwmlp456
  • jjwwmlp456
  • 2017年06月01日 09:47
  • 1351

Validating the Document Types in MIRO and MIR7 While Posting the Entry

Validating the Document Types in MIRO and MIR7 While Posting the Entry
  • champaignwolf
  • champaignwolf
  • 2017年01月20日 10:16
  • 456

Eloquent JavaScript 笔记 一、Values, Types, and Operators

第一章讲js最最基础的东西,数据类型的运算符,甚至连“变量”都没有提及。越是基础的、纯粹的知识,后续应用的场景越是广泛。可以说,只要写js代码,本章的内容就必然会用到。所以,一定要背下来。...
  • wershest
  • wershest
  • 2017年04月27日 12:24
  • 185

Specializing for primitive types

      转自 http://www.scala-notes.org/2011/04/specializing-for-primitive-types/ One interesting featur...
  • noOnlyAndroid
  • noOnlyAndroid
  • 2011年06月05日 09:47
  • 513

Kotlin Reference (四) Basic Types

most from reference基本类型在kotlin中,一切都是对象,我们可以在任何变量上调用成员函数和属性。一些类型可以具有特殊的内部表示:例如,数字、字符和布尔值都可以在运行时被表示为原始...
  • shineflowers
  • shineflowers
  • 2017年08月02日 10:07
  • 172
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Primitive Types and Reference Types in Javascript
举报原因:
原因补充:

(最多只允许输入30个字)