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 相关文章推荐
表单填写时用回车代替TAB的实现方法
Oct 09 Javascript
jQuery 剧场版 你必须知道的javascript
May 27 Javascript
FireFox JavaScript全局Event对象
Jun 14 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
Dec 30 Javascript
jquery单行文字向上滚动效果示例
Mar 06 Javascript
分享自己用JS做的扫雷小游戏
Feb 17 Javascript
javascript实现计时器的简单方法
Feb 21 Javascript
基于 Bootstrap Datetimepicker 联动
Aug 03 Javascript
layui点击按钮添加可编辑的一行方法
Aug 15 Javascript
Vue前后端不同端口的实现方法
Sep 19 Javascript
js canvas实现画图、滤镜效果
Nov 27 Javascript
使用vue实现通过变量动态拼接url
Jul 22 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抓取https的内容的代码
2010/04/06 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
Gambit vs CL BO3 第二场 2.13
2021/03/10 DOTA
JS控制表格隔行变色
2006/06/26 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
2016/05/14 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
Django ModelForm操作及验证方式
2020/03/30 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
美国眼镜网:GlassesUSA
2017/09/07 全球购物
DNA测试:Orig3n
2019/03/01 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
建筑设计所实习生自我鉴定
2013/09/25 职场文书
学校十一活动方案
2014/02/01 职场文书
大学生未来职业生涯规划书
2014/02/15 职场文书
《植物妈妈有办法》教学反思
2014/02/25 职场文书
环保建议书500字
2014/05/14 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
离婚上诉状范文
2015/05/23 职场文书
开工典礼致辞
2015/07/29 职场文书