Javascript 关于基本类型和引用类型的个人理解


Posted in Javascript onNovember 01, 2019

 1.基础类型

A. 基础类型有5种,Number,String,Boolean,Null,Undefined

B. 基础类型没有堆的概念,堆只针对引用类型。

所有基础类型都是以key-value形式存放在栈中,其中,基础类型的值不可变,除非是重新赋值,

比如:

var a = "1234";
a[0] = "k";//对值本身修改,无效
console.log(a)//1234

a = "k";//重新赋值
console.log(a)//k

 2.引用类型

引用类型,如Array,Object,Function,Date,RegExp等

所有引用类型都是以key-value形式存放在栈中,其中,引用类型的key-value存放的value是指针地址,地址指向所在的堆的某个空间 ,这个空间存放着引用类型数据的值。

注意:

引用数据的值为 “堆值”,设堆值为value1 ,堆值对象内部的的key-value形式的value值为值中值 ,设此堆值为 “value2” ,在当前例子中,value1是可改变的,value2是不可改变的,除非是重新赋值。

比如:

// 堆值,即value1,可改变
var a = {"name":"jack"};
a = [];//重新赋值
console.log(a)// []
 
// 堆值中值,即value2,与基本数据类型一样不可改变
var a = {"name":"jack"};
a.name[0] = "0";
console.log(a)// {"name":"jack"}

3.传值与传址

如下图所示:

3.1 A代码块是传值

A代码块执行,a和b都会在栈区开辟一个空间用来存放值10,并且以key-value形式存放。A代码块是传值

3.2 B代码块是传址

B代码块执行,a1会开辟一个空间用来存放指针地址,然后a1的指针地址会赋值给b1,即b1同样会开辟一个空间用来放指针地址,而a1,b1指针地址指向的都是堆区的"堆值",即value1。

4.比较

4.1 基础类型的比较是值的比较

比如:

var a = 1;
var b = 1;
console.log(a == b);//true

4.2 引用类型的比较是引用的比较

同一个引用比较是可以相等,不同引用的比较不等。

比如:

//不同引用的比较
var p1 = {};
var p2 = {};
console.log(p1 == p2) //false
 
//不同引用的比较
var p3 = {"name":{},"age":30};
var p4 = {"name":{},"age":30};
console.log(p3.name == p4.name);//false(这个是引用比较)
console.log(p3.age == p4.age);//true(这个是值比较)
 
//同引用的比较
var p5 = {};
var p6 = p5;
console.log(p5 == p6)//true

如果引用被赋值别的类型,那么当前引用会被切断和值的指针地址。

如下图:

Javascript 关于基本类型和引用类型的个人理解

当a1重新赋值的时候,a1和 “ 堆值--> {} ” 的联系被替换成新的指针地址,即“ 堆值--> [] ”

好了这篇关于js 基本类型和引用类型的文章就介绍到这,更多请继续往下阅读相关文章。

Javascript 相关文章推荐
AutoSave/自动存储功能实现
Mar 24 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
Sep 02 Javascript
web 前端常用组件之Layer弹出层组件
Sep 22 Javascript
JS实现类似51job上的地区选择效果示例
Nov 17 Javascript
JS图片轮播与索引变色功能实例详解
Jul 06 Javascript
关于HTML5的data-*自定义属性的总结
May 05 Javascript
Angular5集成eventbus的示例代码
Jul 19 Javascript
webpack4 处理CSS的方法示例
Sep 03 Javascript
vue项目中跳转到外部链接的实例讲解
Sep 20 Javascript
微信小程序实现侧边分类栏
Oct 21 Javascript
解决vue自定义全局消息框组件问题
Nov 22 Javascript
微信小程序修改数组长度的问题的解决
Dec 17 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
Nov 01 #Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
Nov 01 #Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
Nov 01 #Javascript
vue实现点击追加选中样式效果
Nov 01 #Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 #Javascript
解决vue-router 二级导航默认选中某一选项的问题
Nov 01 #Javascript
微信js-sdk 录音功能的示例代码
Nov 01 #Javascript
You might like
PHP编程网上资源导航
2006/10/09 PHP
模拟xcopy的函数
2006/10/09 PHP
php4的session功能评述(三)
2006/10/09 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
用穿越火线快速入门php面向对象
2012/02/22 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
python3使用smtplib实现发送邮件功能
2018/05/22 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
什么是方法的重载
2013/06/24 面试题
2014年调度员工作总结
2014/11/19 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
年终工作总结范文
2019/06/20 职场文书
MongoDB支持的索引类型
2022/04/11 MongoDB