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 相关文章推荐
JS字符串函数扩展代码
Sep 13 Javascript
js和jquery如何获取图片真实的宽度和高度
Sep 28 Javascript
node.js中的console.assert方法使用说明
Dec 10 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
Sep 01 Javascript
jQuery拖动布局其结果保存到数据库
Oct 09 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
May 07 Javascript
Javascript实现时间倒计时效果
Jul 15 Javascript
jQuery中实现text()的方法
Apr 04 jQuery
ant-design-vue 快速避坑指南(推荐)
Jan 21 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
Jun 22 Javascript
纯js+css实现在线时钟
Aug 18 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
Oct 29 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中COOKIES使用示例
2015/07/26 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
js+css在交互上的应用
2010/07/18 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
简单实现异步编程promise模式
2015/07/31 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
vue - props 声明数组和对象操作
2020/07/30 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Django中信号signals的简单使用方法
2019/07/04 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
五种Python转义表示法
2020/11/27 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
档案接收函
2014/01/13 职场文书
解除劳动合同证明书
2014/09/26 职场文书
仙境之桥观后感
2015/06/16 职场文书
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL