JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析


Posted in Javascript onMarch 04, 2020

本文实例讲述了JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别。分享给大家供大家参考,具体如下:

js数据类型:基本数据类型和引用数据类型(文章最下面会介绍各类型的基础以及注意事项

基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象

当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值

基本数据类型:数字(Number)、字符串(String)、布尔(Boolean)、空(Null)、未定义(Undefined)

引用数据类型:也就是对象类型Object type,比如:Object 、Array 、Function 、Data等

基本数据类型

基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值

var a = 1;
var b = a;//b获取的是a值得一份拷贝,虽然,两个变量的值相等,但是两个变量保存了两个不同的基本数据类型值
b = 2;
console.log(a); // 1

b只是保存了a复制的一个副本。所以,b的改变,对a没有影响。

下图演示了这种基本数据类型赋值的过程:

JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析

栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间。

所有在方法中定义的变量都是放在栈内存中,随着方法的执行结束,这个方法的内存栈也自然销毁 

优点:存取速度比堆快,仅次于直接位于CPU中的寄存器,数据可以共享; 
缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

栈:可以递归调用方法,这样随着栈深度的增加,JVM维持着一条长长的方法调用轨迹,知道内存不够分配,产生栈溢出。

引用类型数据

javascript的引用数据类型是保存在堆内存中的对象。

与其他语言的不同是,你不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈内存中的引用地址。

所以,引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象。

var obj1 = new Object();
var obj2 = obj1;
obj2.name = "叶落森";
console.log(obj1.name); //叶落森

说明这两个引用数据类型指向了同一个堆内存对象。obj1赋值给onj2,实际上这个堆内存对象在栈内存的引用地址复制了一份给了obj2,但是实际上他们共同指向了同一个堆内存对象。实际上改变的是堆内存对象。(这里就会引出深拷贝和浅拷贝问题,这里是浅拷贝,具体的见前面一篇堆和栈的区别)

下面我们来演示这个引用数据类型赋值过程:

JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析

 

各类型的基础以及注意事项

1.Number类型

Number类型包含整数和浮点数(浮点数数值必须包含一个小数点,且小数点后面至少有一位数字)两种值。

NaN:非数字类型。特点:① 涉及到的 任何关于NaN的操作,都会返回NaN   ② NaN不等于自身。

isNaN() 函数用于检查其参数是否是非数字值。

isNaN(123) //false
isNaN("hello") //true

2.String类型

字符串有length属性。

字符串转换:转型函数String(),适用于任何数据类型(null,undefined 转换后为null和undefined);toString()方法(null,defined没有toString()方法)。

3.Boolean类型

该类型只有两个值,true和false

4.Undefined类型

只有一个值,即undefined值。使用var声明了变量,但未给变量初始化值,那么这个变量的值就是undefined。

5.Null类型

null类型被看做空对象指针,前文说到null类型也是空的对象引用。

6.Object类型

js中对象是一组属性与方法的集合。这里就要说到引用类型了,引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js获取 type=radio 值的方法
May 09 Javascript
jquery实现简单文字提示效果
Dec 02 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
Jun 12 Javascript
基于AngularJS实现iOS8自带的计算器
Sep 12 Javascript
Angular2 环境配置详细介绍
Sep 21 Javascript
如何使用 vue + d3 画一棵树
Dec 03 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
Mar 07 Javascript
深入了解JavaScript 的 WebAssembly
Jun 15 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
Aug 06 Javascript
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
JavaScript前端面试组合函数
Jun 21 Javascript
微信浏览器左上角返回按钮监听的实现
Mar 04 #Javascript
js回调函数原理与用法案例分析
Mar 04 #Javascript
在pycharm中开发vue的方法步骤
Mar 04 #Javascript
Vue+Vuex实现自动登录的知识点详解
Mar 04 #Javascript
vuex入门最详细整理
Mar 04 #Javascript
JavaScript 严格模式(use strict)用法实例分析
Mar 04 #Javascript
vue 自定义组件的写法与用法详解
Mar 04 #Javascript
You might like
php多层数组与对象的转换实例代码
2013/08/05 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
PHP经典面试题集锦
2015/03/19 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
js实现双色球效果
2020/08/02 Javascript
python读取html中指定元素生成excle文件示例
2014/04/03 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Python实现的弹球小游戏示例
2017/08/01 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
Pycharm Git 设置方法
2020/09/15 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
写给女朋友的道歉信
2014/01/12 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
二胎满月酒致辞
2015/07/29 职场文书