javascript变量中基本类型和引用类型的详解解读
前言:
Javascript语言中的变量和其他语言的变量有很大区别,javascript松散类型的本质,决定了它只是在特定时间时间保存特定值得名字而已。由于不存在定义某个变量必须保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变,从某种程度讲,这是一个既强大又容易出问题的特性。
本文将从以下几点介绍ECMAScript变量的定义分类以及特性:
1.ECMAScript变量中数据类型的值的分类
2.定义基本类型的值和引用类型的值的方式
3.如何复制变量的值,复制的原理解读
4.参数的传递过程
5.类型的检测
正文内容:
1.ECMAScript变量中数据类型的值的分类
ECMAScript中变量可能包含两种不同类型的值:基本类型的值和引用类型的值。
基本类型:undefined,null,number,boolean,string。
引用类型:数组,对象,函数
区别比较:存储位置不同,基本类型是存储在栈内存中的简单字段,占据空间小,大小固定,属于被频繁使用的数据;而引用数据类型是存储在堆内存中的对象,占据空间大,大小不固定,如果存储在栈内存中,将影响程序运行的性能;引用类型的指针存储在栈内存中,该指针指向堆中该实体的起始位置,当解释器寻找引用值时,会首先检索栈中的地址,取得指针后从堆中获取实体。为了方便理解可以参考下图:

2.定义基本类型的值和引用类型的值的方式
定义基本类型的值和引用类型的值的方式类似:创建一个变量并为这个变量赋值。当这个值保存到变量中后,对于不同类型的值可以执行的操作就大相径庭了。对于引用类型,我们可以为其添加属性和方法,也可以改变和删除其属性和方法,大家可以参考下面的例子来加深理解:
var obj = new Object();
obj.name = 'hwg';
alert(obj.name); //hwg
以上代码代码创建一个对象并且为其设置了一个name属性,并给属性赋值为hwg,如果对象不被销毁,那么这个属性将一直存在。对于基本数据类型进行同样操作如下代码:
var name = 'hwg';
name.age = 22;
alert(name.age);//undefined
在这个例子中我们给字符串name定义了一个age属性,并且给其赋值22,最后进行访问发现这个属性不见了,打印输出undefined说明基本类型不能添加属性,否则会报错。
3.如何复制变量的值,复制的原理解读
从一个变量向另一个变量赋值基本类型和引用类型的值时,也存在不同。首先来看基本类型值得复制过程:
例子: var num = 5;
var num1 = num;
再次,num中先存入值5,当使用num来初始化num1时,num1中也保存了值5,但是num1中的5和num中的5在内存中是独立的,num1的值可以理解为是num值得一个副本,此后两个变量可以参与任何操作且不互相影响,为了方便理解请看下图:
| num | 5(Number类型) |
| num | 5(Number类型) |
| num1 | 5(Number类型) |
当从一个变量向另一个变量复制引用类型类型的值时,同样也会将存储在变量对象中的值复制一份放到新开辟的内存空间。不同的是,这个值得副本是一个指针,这个指针指向存储在堆中的一个对象,复制结束后,本质上两个变量将会引用同一个堆中的对象,因此改变其中一个变量,另一个变量也会受到影响,请看下面例子:
var obj = new Object();
var obj1 = obj;
obj.name = 'hwg';
alert(obj1.name);//hwg
首先,变量obj保存了一个新对象的实例,然后将obj的值赋值给obj1,此时,obj和obj1都指向同一个对象。这样给对象obj添加属性name后,也可以通过obj1进行访问这个属性。图示如下:

4.参数的传递过程
ECMAScript中所有的函数的参数都是按照值来进行传递的,把函数外部的值传递给函数内部的参数,就如同把值从一个变量复制到另一个变量一样。
在向参数传递基本类型的值时,被传递的值会复制给一个局部变量;在向参数传递一个引用类型的参数时,会把这个值在内存中的地址复制给一个局部变量。
为了更好理解传参,请看下面几个例子:
function add(num){
num += 1;
return num;
}
var con = 10;
var result = add(con);
alert(con);//10
alert(result);//11
这个例子中的局部变量是add函数的num,在调用这个函数时,变量con作为参数把值10传递给参数num。此时变量con在内存中被复制了一份给参数num以便在函数add中对其进行操作,这样在函数内部操作num的时候,就不会影响函数外部的con变量。下面我们再来使用对象来加深理解,代码如下:
function setAge(obj){
obj.age = 20;//给obj对象设置name属性
}
var object = new Object();
setAge(object);
alert(object.age);//20
以上代码初始化一个对象,并将其保存在object中,然后调用setAge函数,此时变量object就被复制给了局部变量obj。在函数内部,obj和object引用的是同一个对象。也就是说即使这个变量是按照值来进行传递的,obj也会按照引用来访问同一个对象。此时在函数内部给obj添加age属性的时候,函数外部的object也将有所反应,此处请牢记函数的参数都是按值传递的,实际上,当在函数内部重写obj或者给obj添加属性时,这个变量obj引用的就是一个局部对象,而这个局部对象会在函数执行完毕后销毁,不会影响全局变量。
5.类型的检测
基本类型的检测使用typeof,引用类型的检测就用instanceof,ECMA规定任何在内部实现了[[call]]方法的对象都应该在应用typeof操作符时候返回'function'。下面举几个小例子方便理解
var a = 'aaa';
alert(typeof a);//string
var person = new Object();
alert(person instanceof Object)//true
总结:
javascript中的变量可以保存两种类型:基本类型和引用类型,特点如下:
基本类型的值在内存中占据固定大小的空间,因此被保存在栈内存;
从一个变量向另一个变量复制基本类型的值,会创建这个值得一个副本;
引用类型的值是对象,保存在堆内存中;
包含引用类型的变量实际是包含的是一个指向该对象的指针,这个指针保存在栈内存,在从一个变量向另一个变量复制引用类型的值,复制的其实就是指针,并且这两个变量最终指向的都是堆内存中的同一个对象;
函数的参数都是按值传递的;
基本类型的检测使用typeof,引用类型的检测就用instanceof。
javascript变量中基本类型和引用类型的详解解读的更多相关文章
- javascript数据基本类型和引用类型区别详解
JavaScript基本数据类型: js基本数据类型包括:undefined,null,number,boolean,string.基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值. ...
- [转]javascript中基本类型和引用类型的区别分析
基本类型和引用类型 ECMAScript包含两个不同类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段:引用类型值指由多个值构成的对象.当我们把变量赋值给一个变量时,解析器首先要做的就是确 ...
- javascript中基本类型和引用类型的区别分析
大多数人系统学习过的程序设计语言,在这些语言的学习过程中最早学到的几个要点之一就是值类型和引用类型的区别.下面我们来看一下在 JavaScript 中基本数据类型(Primitive Types)和引 ...
- Javascript高级程序设计——基本类型和引用类型的值
ECMAScript中的变量有两种不同的数据类型的值: 基本类型:基本类型的值是简单的数据段.包括:Undefined.Null.Number.Boolean.String五种 引用类型:引用类型的值 ...
- JavaScript 深入了解基本类型和引用类型的值
转载:https://segmentfault.com/a/1190000006752076 一个变量可以存放两种类型的值,基本类型的值(primitive values)和引用类型的值(refere ...
- 再谈java两种变量(基本类型和引用类型)(综合各路大神)
基本类型: 基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值. int a: a=250: //声明变量a的同时,系统给a分配了数据空间. 引用类型: 是一个对象类型,值是什么呢? ...
- Java中基本类型和引用类型(简单介绍)
8种基本类型 一.4种整型 byte 1字节 -128——127 short 2 字节 -32,768 —— 32,767 in ...
- 基本类型和引用类型的值 [重温JavaScript基础(一)]
前言: JavaScript 的变量与其他语言的变量有很大区别.JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类 ...
- Java 基础 - 基本类型和引用类型
ref: https://www.cnblogs.com/ysocean/p/8482979.html#_label2 ------------------ 这里再给大家普及一个概念,在 Java 中 ...
随机推荐
- How to add jdk8 in Eclipse Indigo
I just read How to have Eclipse use JDK8 to compile a project? What i added jdk8 to eclipse as, Fro ...
- python 生成测试报告并发送邮件
前言: 使用unittest编写自动化测试脚本,执行脚本后可以很方便看到测试用例的执行情况. 但如果想向领导汇报工作,就需要提供更直观的测试报告. 思路: 使用unittest编写测试用例,HTMLT ...
- 集合运算(UNION)
表的加法 集合运算:就是满足统一规则的记录进行的加减等四则运算. 通过集合运算可以得到两张表中记录的集合或者公共记录的集合,又或者其中某张表中记录的集合. 集合运算符:用来进行集合的运算符. UNIO ...
- kipmi0进程单核CPU100%的解决办法
top查看服务器进程,发现有个kipmi0的进程竟然CPU的单核占用高达100%,而且居高不下. 于是上网搜了搜大家的说法了给出的链接,大概意思是一个固件问题,可以通过修改文件来解决. 专业的解释地址 ...
- 从读写分离到 CQRS,张大胖是如何解决性能问题的?
转自:https://mp.weixin.qq.com/s/rpiYZkxiLKa77OFw8XaBwA 不堪重负的数据库 张大胖公司的数据库已经不堪重负了. 这个系统最早是两个实习生写的, 按照最初 ...
- WERTYU(WERTYU, UVa10082)
把手放在键盘上时,稍不注意就会往右错一 位.这样,输入Q会变成输入W,输入J会变成输 入K等.键盘如图所示. 输入一个错位后敲出的字符串(所有字母均大写),输出打字员本来想打出的句子.输入保 证合法, ...
- 【密码学】RSA加密 kotlin实现方法(支持任意字节长度)
这个编辑器不支持kotlin,尴尬了···· 算了,就用Java来弄吧 val 定义常量 var 定义变量 具体kotlin的开发手册详见:http://www.runoob.com/kotlin/k ...
- python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了
我们上次做了 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍 有些朋友觉得 利用正则表达式去提取信息 太特么麻烦了 有没有什么别的方式 更方便过滤我们想要的内容啊 emmmm 你还别说 还 ...
- ZOJ 2699 Police Cities
Police Cities Time Limit: 10 Seconds Memory Limit: 32768 KB Once upon the time there lived a ki ...
- 用saltapi远程操作tomcat启停时,输出日志乱码再解决
以前解决过一次,是定义LC_ALL为指定编码.但这种思路不完全,因为机器各各不同,系统编码本身不一致(标准化之路漫长啊) 故而在其它一些系统的部署时,用上一次的方案,反而会有错误产生. 于是,按洪军找 ...