JS中原始值和引用值的储存方式示例详解


Posted in Javascript onMarch 23, 2018

在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值

  • 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number、Stirng、Boolean、Null、Underfined
  • 引用值指的是复合数据类型的值,包括:Object、Function、Array、Date、RegExp

根据数据类型不同,有的变量储存在栈中,有的储存在堆中。具体区别如下:

原始变量及他们的值储存在栈中,当把一个原始变量传递给另一个原始变量时,是把一个栈房间的东西复制到另一个栈房间,且这两个原始变量互不影响。

引用值是把  引用变量的名称储存在栈中,但是把其实际对象储存在堆中,且存在一个指针由变量名指向储存在堆中的实际对象,当把引用对象传递给另一个变量时,复制的其实是指向实际对象的指针, 此时 两者指向的 是同一个数据,若通过方法改变其中一个变量的值,则访问另一个变量时,其值也会随之加以改变;但若不是通过方法 而是通过 重新赋值  此时 相当于 重新开了一个房间  该值的原指针改变  ,则另外一个 值 不会随他的改变而改变。

看示例:

var a="hello";
var b=a;
a="world";
alert(a);//world
alert(b);//hello
var arr=[1,3];
arr1=arr;
arr.push(5);
alert(arr)//1,3,5
alert(arr1);//1,3,5
arr=[7,8];
alert(arr);//7,8
alert(arr1);//1,3,5

用图来表示 结果如下:

原始变量的值互不影响,引用变量arr和arr1指向的为同一对象,所以当对arr通过方法改变其值时(堆房间里的数据发生变化),访问arr1的数据时就会访问到改变后的对象

JS中原始值和引用值的储存方式示例详解

通过非方法来改变引用变量的值时,会为该引用变量重新创建一个堆房间,此时指针也会发生变化:

JS中原始值和引用值的储存方式示例详解

总结:

Number、Stirng、Boolean、Null、Underfined这些基本数据类型,他们的值直接保存在栈中;

Object、Function、Array、Date、RegExp这些引用类型,他们的引用变量储存在栈中,通过指针指向储存在堆中的实际对象

以上所述是小编给大家介绍的JS中原始值和引用值的储存方式示例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS实现控制表格行文本对齐的方法
Mar 30 Javascript
javascript实现简单的鼠标拖动效果实例
Apr 10 Javascript
javascript密码强度校验代码(两种方法)
Aug 10 Javascript
jquery如何获取元素的滚动条高度等实现代码
Oct 19 Javascript
理解JS绑定事件
Jan 19 Javascript
jQuery中通过ajax的get()函数读取页面的方法
Feb 29 Javascript
利用PM2部署node.js项目的方法教程
May 10 Javascript
vue中axios处理http发送请求的示例(Post和get)
Oct 13 Javascript
Vue代码分割懒加载的实现方法
Nov 23 Javascript
jQuery实现获取选中复选框的值实例详解
Jun 28 jQuery
详解webpack-dev-middleware 源码解读
Mar 23 Javascript
Vue结合路由配置递归实现菜单栏功能
Jun 16 Javascript
剖析Angular Component的源码示例
Mar 23 #Javascript
vue利用axios来完成数据的交互
Mar 23 #Javascript
JS动画定时器知识总结
Mar 23 #Javascript
p5.js 毕达哥拉斯树的实现代码
Mar 23 #Javascript
轻量级JS Cookie插件js-cookie的使用方法
Mar 22 #Javascript
浅谈Webpack 持久化缓存实践
Mar 22 #Javascript
深入浅析Vue.js中 computed和methods不同机制
Mar 22 #Javascript
You might like
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
浅谈php和.net的区别
2014/09/28 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
JS打开新窗口的2种方式
2013/04/18 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
Keras搭建自编码器操作
2020/07/03 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
酒店服务实习自我鉴定
2013/09/22 职场文书
优秀实习自我鉴定
2013/12/04 职场文书
公司活动方案范文
2014/03/06 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
离职证明格式样本
2015/06/12 职场文书
党员读书活动心得体会
2016/01/14 职场文书
高二英语教学反思
2016/03/03 职场文书
德生BCL3000抢先使用感受和评价
2022/04/07 无线电