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写的一个简单slider
Apr 29 Javascript
jQuery简单实现提交数据出现loading进度条的方法
Mar 29 Javascript
javascript弹出带文字信息的提示框效果
Jul 19 Javascript
JavaScript制作弹出层效果
Dec 02 Javascript
如何提高Dom访问速度
Jan 05 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
Jan 12 Javascript
angularjs之$timeout指令详解
Jun 13 Javascript
谈谈JS中的!!
Dec 07 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
Dec 14 Javascript
用vue-cli开发vue时的代理设置方法
Sep 20 Javascript
使用electron将vue-cli项目打包成exe的方法
Sep 29 Javascript
Vue 权限控制的两种方法(路由验证)
Aug 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
php实现socket推送技术的示例
2017/12/20 PHP
JavaScript 参考教程
2006/12/29 Javascript
JSON辅助格式化处理方法
2013/03/26 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
Angular组件化管理实现方法分析
2017/03/17 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
python线程的几种创建方式详解
2019/08/29 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
介绍一下write命令
2012/09/24 面试题
资深财务管理人员自我评价
2013/09/22 职场文书
总经理岗位职责描述
2014/02/08 职场文书
校庆接待方案
2014/03/18 职场文书
产品开发计划书
2014/04/27 职场文书
班级口号大全
2014/06/09 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书