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 相关文章推荐
Javascript的并行运算实现代码
Nov 19 Javascript
jquery 学习之二 属性(html()与html(val))
Nov 25 Javascript
JavaScript获取flash对象与网上的有所不同
Apr 21 Javascript
JavaScript极简入门教程(一):基础篇
Oct 25 Javascript
JavaScript获取网页中第一个图片id的方法
Apr 03 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
Jun 11 Javascript
详解JavaScript逻辑Not运算符
Dec 04 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
Jun 03 Javascript
vue自定义指令directive实例详解
Jan 17 Javascript
Node.js文件编码格式的转换的方法
Apr 27 Javascript
JavaScript的Set数据结构详解
Feb 18 Javascript
Three.js实现雪糕地球的使用示例详解
Jul 07 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/11/04 PHP
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
Node.JS文件系统解析实例详解
2017/05/15 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
Python中规范定义命名空间的一些建议
2016/06/04 Python
带你了解python装饰器
2017/06/15 Python
python机器学习之贝叶斯分类
2018/03/26 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
Django保护敏感信息的方法示例
2019/05/09 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
详解python调用cmd命令三种方法
2019/07/08 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
法律专业自我鉴定
2013/10/03 职场文书
建筑工程技术应届生求职信
2013/11/17 职场文书
人事助理岗位职责
2013/11/18 职场文书
高中军训感言200字
2014/02/23 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
民主评议党员工作总结
2014/10/20 职场文书
2014年评职称工作总结
2014/11/20 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
工程质量保证书
2015/05/09 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
HTML+CSS制作心跳特效的实现
2021/05/26 HTML / CSS
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL