值类型:也称为原始数据或原始值(primitive value)。

这类值存储在栈(stack)中,栈是内存中一种特殊的数据结构,也称为线性表,栈按照后进先出的原则存储数据,先进入的数据被压入栈底,最后插入(push)的数据放在栈顶,需要读取数据时从栈顶开始弹出(pop)数据,即最后一个数据被第一个读出来。因此说,值类型都是简单的数据段。变量的位置和变量值的位置是重叠的,也就是说值类型的数据被存储在变量被访问的位置。

引用类型:这类值存储在堆(heap)中,堆是内存中的动态区域,相当于自留空间,在程序运行期间会动态分配给代码和堆栈。

堆中存储的一般都是对象,然后通过一个编号传递给栈内变量,这个编号就是所谓的引用指针(point),这样变量和变量值之间是分离的,它们通过指针相联系。当读写数据时,计算机通过变量的指针找到堆中的数据块,并进行操作。

在JavaScript中,number、string、boolean、null和undefined型数据都是值类型。由于值类型数据占据的空间都是固定的,所以可以把它们存储在狭窄的内存栈区。这种存储方式更方便计算机进行查找和操作,所以执行速度会非常快。

而对于object型数据(包括function和array)来说,由于它们的大小是不固定的,所以不能存储在栈区,只能被分配到堆区,如果存储在栈区,则会降低计算机寻址的速度。而堆的空间是不固定的,所以很适合存储大小不固定的对象数据,然后在栈区存储对象在堆区的地址即可,而地址的大小是固定的,所以这种分离存储的方法不会影响计算机的寻址速度,对于变量的性能也没有任何负面影响(如图)。

在JavaScript语言中,object、function和array等对象都是引用型数据。很多语言都把字符串视为引用型数据,而不是值类型,因为字符串的长度是可变的。但是JavaScript比较特殊,它把字符串作为值类型进行处理。不过,字符串在复制和传递运算中,是以引用型数据的方法来处理的。

最新文章

  1. C# 获取 mp3文件信息
  2. (转) Deep Reinforcement Learning: Playing a Racing Game
  3. 温故知新---重读C#InDepth(二)
  4. Extjs3.3 + swfUpload2.2 实现多文件上传组件
  5. 怎样查看python的api
  6. 反射 reflect 初始学习
  7. DBcontext应用于已存在数据库
  8. Codeforces 328A-IQ Test(数列)
  9. Android系统开机启动画面显示过程简要说明
  10. Hibernate执行原生态sql语句
  11. asp.net core 排序过滤分页组件:sieve(1)
  12. CentOs~程序部署那些事
  13. grumphp在docker里问题
  14. python:windows下python2.7安装mysql-python失败【转】
  15. laravel5.8笔记六:公共函数和常量设置
  16. 视频压缩和H264
  17. [国际A类会议] 2018最最最顶级的人工智能国际峰会汇总!CCF推荐!
  18. Keepalived+HAproxy实现高可用负载均衡
  19. eclipse下使用cygwin的方法(Windows下用eclipse玩gcc/g++和gdb)
  20. C#中对于float,double,decimal的误解(转载)

热门文章

  1. java和python细节总结和java中string 的+操作
  2. win7下php5.6安装redis扩展
  3. [日常训练]常州集训day7
  4. Namenode主节点停止报错 Error: flush failed for required journal
  5. SQL Server附加数据库时失败,提示:“未重新生成日志,因为有不止一个日志文件”
  6. NuGet在Push的时候提示“远程服务器返回错误:(403)已禁用”问题解决
  7. Unity 插件制作笔记(持续更新)
  8. SQL Server 分页
  9. [Android]ADB Server didn't ACK错误的解决方法
  10. Linux tcpdump 命令详解