基本数据类型引用数据类型
1、栈(stack)和堆(heap)
stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小也不一定会自动释放
2、数据类型
JS分两种数据类型:
js的六或七大数据类型:Number, String, Boolean, Undefined , Null , Object, Symbol(ES6)
基本数据类型:Number、String、Boolean、Null、 Undefined、Symbol(ES6),这些类型可以直接操作保存在变量中的实际值。
引用数据类型:Object(在JS中除了基本数据类型以外的都是对象,数据是对象,函数是对象,正则表达式是对象)
3、基本数据类型(存放在栈中)
基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,所以可以直接按值访问。基本数据类型的值是没有办法添加属性和方法的
1 2 3 4 5 |
|
下图演示了这种基本数据类型赋值的过程:
4、引用数据类型(存放在堆内存中的对象,每个空间大小不一样,要根据情况进行特定的配置)
引用类型是存放在堆内存中的对象,变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址),这个指针指向堆内存。
引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象
1 2 3 4 5 6 7 |
|
说明这两个引用数据类型指向了同一个堆内存对象。obj1赋值给obj2,实际上这个堆内存对象在栈内存的引用地址复制了一份给了obj2,但是实际上他们共同指向了同一个堆内存对象,所以修改obj2其实就是修改那个对象,所以通过obj1访问也能访问的到。
1 2 3 4 5 6 7 8 9 |
|
从上面我们可以得知,当我改变b中的数据时,a中数据也发生了变化;但是当我改变c的数据值时,a却没有发生改变。
这就是传值与传址的区别。因为a是数组,属于引用类型,所以它赋予给b的时候传的是栈中的地址(相当于新建了一个不同名“指针”),而不是堆内存中的对象。而c仅仅是从a堆内存中获取的一个数据值,并保存在栈中。所以b修改的时候,会根据地址回到a堆中修改,c则直接在栈中修改,并且不能指向a堆内存中。
最后: 总结基本数据类型和引用数据类型区别
1、声明变量时内存分配不同
*原始类型:在栈中,因为占据空间是固定的,可以将他们存在较小的内存中-栈中,这样便于迅速查询变量的值
*引用类型:存在堆中,栈中存储的变量,只是用来查找堆中的引用地址。
这是因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响
2、不同的内存分配带来不同的访问机制
在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的按引用访问。
而原始类型的值则是可以直接访问到的。
3、复制变量时的不同
1)原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
2)引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,
也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。
(这里要理解的一点就是,复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存在栈中指向这个对象指针的变量罢了)。多了一个指针
4、参数传递的不同(把实参复制给形参的过程)
首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。 但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。
1)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
2)引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!
因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。
基本数据类型引用数据类型相关推荐
- js数据类型(基本数据类型 | 引用数据类型)
一.数据类型 JS分两种数据类型: 基本数据类型:**Number.String.Boolean.Null. Undefined.Symbol(ES6),**这些类型可以直接操作保存在变量中的实际值. ...
- 【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )
文章目录 引用类型 引用类型 引用数据类型 : 1. 引用数据类型定义 : 类型名称& 变量名 = 对应类型变量名称 ; //① 定义 普通 类型 变量int a = 8;//② 定义 引用类 ...
- 数据类型和存储上的差别,基本数据类型,引用数据类型
在 js 中把我们的数据进行了分类,可以理解为 2 大类 基本数据类型: string,number,null,Boolean,undefined,symbol 引用数据类型: Object,Arra ...
- (JAVA面试)基本数据类型 引用数据类型详解
基本数据类型 byte 1字节 short char 2字节 int float 4字节 double long 8字节 引用数据类型 引用类型指向一个对象,不是原始值,指向对象的变量是引用变量 在j ...
- 理解Java自定义类作为数据类型——引用数据类型
目录 说在前面的话 复现问题 引用数据类型的理解 总结 说在前面的话 前言:Java的数据类型按照类型可分为基本数据类型(byte.short.int.long.double.float.char.b ...
- ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...
JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...
- Java数据类型:基本数据类型和引用数据类型
前面我们提到 Java 语言是强类型语言,编译器存储在变量中的数值具有适当的数据类型.学习任何一种编程语言都要了解其数据类型,本文将详细介绍 Java 中的数据类型. Java 语言支持的数据类型分为 ...
- java中引用数据类型有哪几种
本文主要介绍了java中引用数据的类型,具有很好的参考价值.希望对你有帮助.如有错误或不足之处,请不吝赐教. 目录 Java中的引用数据类型有哪些?先说Java中的引用数据类型:1.类别引用2.接口参 ...
- JavaScript数据类型基本数据类型与引用数据类型的区别
JavaScript数据类型 1.JavaScript判断数据类型 typeof操作符 使用typeof操作符可以返回变量的数据类型 typeof操作符有带括号和不带括号两种用法 typeof (变量 ...
最新文章
- 一致性hash算法虚拟节点_一致性哈希算法——虚拟节点
- leetcode-有效的括号(三种语言不同思路)
- Oracle sys或者system的默认密码
- [NOI2011]兔兔与蛋蛋游戏 二分图博弈
- python编辑公式_分分钟甩Word几条街,Python编辑公式竟可以如此简单
- Black Box(POJ 1442·TREAP实现)
- ControlStyles(枚举)
- 最新创意购物促销海报设计,广告人必看!
- Maven下载jar包失败的原因- 解决方法汇总
- javascript中的滚动到顶部和Scroll有关的方法
- 【hdu 4658】Integer Partition (无序分拆数、五边形数定理)
- CentOS安装SVN
- pdfobject div中预览pdf
- 东芝固态硬盘升级工具下载(软件+DMG)
- 弘辽科技:新手拼多多店铺该怎么引流
- Excel精选28个实用技巧实例学习
- LSV加载大面积实景三维模型出现偏移,如何投影变换处理?
- 腾讯云CentOS7运行基于SSM的个人博客----第三节:使用Dokcer安装JDK、Tomcat环境
- 如何保障云上数据安全?一文详解云原生全链路加密
- Windows10系统goland代码跳转ctrl + alt +←或→箭头快捷键无效
热门文章
- java 增加内存_如何增加java虚拟机可以使用的最大内存
- python获取控件内容_python通过win32api轻松获取控件的属性值
- 手机mstsc远程工具_microsoft remote desktop android下载
- idea突然很卡解决办法
- openwrt 处理间歇性无法上网(DNS故障)问题
- StringTokenizer使用讲解
- 2020中兴开发岗笔试题
- Python 抓取 快代理、西刺代理 、西拉代理等等 构建免费代理池
- 人工智能数学课高等数学线性微积分数学教程笔记(1. 数学内容概述)
- 利用Google Chrome滚动截屏,截取整个网页