javascript 基本数据类型、引用数据类型
阅读目录
数据类型
1. ECMAScript变量包含两种不同类型的值:基本类型值、引用类型值;
2. 基本类型值:指的是保存在栈内存中的简单数据段;
3. 引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针指向内存堆中实际的值;
* 理解一下 栈内存 和 堆内存:




* 也就是上边 2、3条所说的意思:基本数据类型在栈中以简单数据段的方式保存; 引用类型 在栈中保存的是指向引用对象的地址;
两种访问方式
4. 基本类型值:按值访问,操作的是他们实际保存的值;
5. 引用类型值:按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值;

两种类型复制
基本类型变量的复制:
从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上,改变源数据不会影响到新的变量(互不干涉);
引用类型变量的复制:
复制的是存储在栈中的指针,将指针复制到栈中为新变量分配的空间中,而这个指针副本和原指针指向存储在堆中的同一个对象,复制操作结束后,两个变量实际上将引用同一个对象;通过一个指针找到这个公共的对象,对其进行改变,然后我们再通过另一个指针查找到这个公共的对象,实际上,得到的是已经改变后的这个对象;
函数参数的传递
1. ECMA中所有函数的参数都是按值传递的;
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,在向参数传递引用类型的值时,会把这个值所在的堆中的地址复制给一个局部变量;
基本数据类型传递参数
funciton addTen(num){
num+=10;
return num;
}
var a=20;
var result=addTen(count); // 相当于 addTen(num = count) 的过程,即,把 count 赋值给局部变量 num, 然后再执行 addTen() 作用域内的代码
alert(count);//20
alert(resullt);//30
执行结果是:20和30。在这段代码中,将变量count当做参数传递给了函数addTen,也就是相当于将变量count的值复制给了函数addTen的参数。这时addTen的参数num可以看做是函数内部的一个变量。在上段代码中,就相当于两个基本数据类型变量之间的值复制。而基本数据类型都有自己独立的内存地址,所以num和count是没有任何关系的,他们只是值相等而已,函数执行完毕后,count的值并没有改变。而函数外面的result是被直接赋值的,所以result的值就是函数的结果30。
引用类型传递参数
function setName(obj){
obj.name="JCY";
}
var person=new Object(); // 此时 person 存的是 new Object() 在堆中的地址
setName(person); // 相当于 setName(obj = person) 的过程,即,把 person 赋值给局部变量 obj, 然后再执行 setName() 作用域内的代码
alert(person.name);// JCY
执行结果是:JCY。在这段代码中,函数setName的作用是给obj对象添加了一个属性name并给该属性赋值为"JCY",因为obj是引用类型,所以这里属于是将引用类型person赋值给了obj,也就是说person和obj引用了一个内存地址,所以当给obj新加了属性name时,在函数外面的person也跟着改变,最后person.name 的结果为JCY。
引用类型传递参数到底传的是值还是引用
function setName(obj){
obj.name="ABC";
obj=new Object(); // 这句 改变了 局部变量obj 的指向
obj.name="BCD";
}
var person=new Object(); // 此时 person 存的是 new Object() 在堆中的地址
setName(person); // 相当于 setName(obj = person), 即,把 person 赋值给局部变量 obj, 然后再执行 setName() 作用域内的代码
alert(person.name);// ABC
执行结果是:ABC。实例3与实例2的区别是在函数中又加了2行代码,在给obj引用的对象(也就是 person所引用的对象) 新加一个属性name并赋值后, 又将局部变量obj重新指向了一个新的对象(new Object()),然后给这个新对象添加了name属性,并赋了值“BCD”。所以,在我们输出 person.name 的时候,应该输出最后一次对 person 所引用的对象的操作 完成后的 name 值(也就是 obj.name = "ABC" 这句)。
所以,也印证了,ECMA中所有函数的参数都是按值传递的,这句话;
两种变量类型检测
1. Typeof操作符是检测基本类型的最佳工具;
2. 如果变量值是null 或者 对象,typeof 将返回“object”;
3. Instanceof用于检测引用类型,可以检测到具体的,它是什么类型的实例;
4. 如果变量是给定引用类型的实例,instanceof操作符会返回true;

javascript 基本数据类型、引用数据类型的更多相关文章
- Java入门(6)——集合、基本数据类型和引用数据类型的相互转换
集合: 1.HashMap ----> 类 概述: 通过key可以找到value, key就是键, values就是值. 俗称键值对. 特点: 无序的 值可以重复 键不可以重复的 如 ...
- Java中的基本数据类型和引用数据类型的区别
一.数据类型 Java中的数据类型分为两大类,基本数据类型和引用数据类型. 1.基本数据类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long.int.short.byte ②浮点类型:fl ...
- JavaScript中基本数据类型和引用数据类型的区别
1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变 ...
- javascript数据基本类型和引用数据类型区别
基本类型和引用数据类型区别 1.基本数据类型和引用数据类型 javascript中有两种数据类型,分别是基本数据类型和引用数据类型: 基本数据(原始数据)类型指的是简单的数据段,而引用数据类型则指的是 ...
- Web | JavaScript的引用数据类型强制转换类型
我在这里主要的想提下的是JavaScript中的引用类型进行强制转换类型.因为对于基本数据类型的变换大多都是雷同的,很容易熟知,但是引用数据类型有一点小插曲. JavaScript的引用类型主要为对象 ...
- JavaScript中的基本数据类型和引用数据类型
ECMAScript变量包括了两种不同的数据类型 在学习JavaScript的数据类型时,我们通常会把数据类型分成六中(官方认为)Object.String.Boolean.Number.Undefi ...
- JavaScript 引用数据类型
目录 1. 问题描述 2. 原因分析 3. React 中的引用数据类型 4. 业务场景 5. 参考资料 1. 问题描述 今天在写一个代码题时候, 有一个BUG 导致自己停滞好久, 该BUG 可以描述 ...
- JavaScript中基本数据类型和引用数据类型的区别(栈——堆)
JavaScript中基本数据类型和引用数据类型的区别 1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据 ...
- JavaScript基本数据类型和引用数据类型详解
数据类型小知识 JavaScript主要数据类型共有7种,有string.number.boolean.undefined.null.symbol.object.其余7种可以笼统的分为两大类:基本数据 ...
随机推荐
- 编程之美 set 12 快速找出故障机器
题目 1. 所有的 ID 都出现 2 次, 只有一个例外, 找到那个例外的 ID 2. 所有的 ID 都出现两次, 只有两个例外, 找出例外的那两个 总计 1. 剑指 offer 上有这两道题的解法, ...
- UE4中VR模式下窗口单目双目的问题
如果要是单目的话使用HMD MIRROR MODE 3或者4
- SqlSession接口和Executor
mybatis框架在操作数据的时候,离不开SqlSession接口实例类的作用.可以说SqlSession接口实例是开发过程中打交道最多的一个类.即是DefaultSqlSession类.如果笔者记得 ...
- 打开cmd闪退
我们在使用电脑过程中一般会很少用到cmd命令,CMD命令窗口在一些特殊情况时我们会用到,如PING下看网络通不通.在CMD窗口里运行命令如磁盘格式转换,但是有些朋友遇到了这样的问题,在开始运行输入CM ...
- Windows下IPython安装
1:安装Python, 下载后安装即可:https://www.python.org/downloads/windows/,(选择Python2或Python3) 添加Path环境变量 2:安装ez_ ...
- [Docker]——container和主机(host)之间的文件拷贝
1. 从 container 到 主机(host) 使用 docker cp 命令 docker cp <containerId>:/file/path/within/container ...
- 【BZOJ2973】石头游戏 矩阵乘法
[BZOJ2973]石头游戏 Description 石头游戏的规则是这样的. 石头游戏在一个n行m列的方格阵上进行.每个格子对应了一个编号在0~9之间的操作序列. 操作序列是一个长度不超过6且循环执 ...
- 区分兼容IE6/IE7/IE8/IE9/FF的CSS HACK写法
HACK原理:不同浏览器对各中字符的识别不同 在 CSS中常用特殊字符识别表: (1)*: IE6+IE7都能识别*,而标准浏览器FF+IE8是不能识别*的; (2)!important: 除IE6 ...
- klg-jpa:spring-data-jpa 最佳实践
klg-jpa:spring-data-jpa 最佳实践 项目介绍 码云地址:https://gitee.com/klguang/klg-jpa JPA是sun为POJO持久化制定的标准规范,用来操作 ...
- ZOJ 3605 Find the Marble(dp)
Find the Marble Time Limit: 2 Seconds Memory Limit: 65536 KB Alice and Bob are playing a game. ...