javascript中基本类型和引用类型的区别分析

大多数人系统学习过的程序设计语言,在这些语言的学习过程中最早学到的几个要点之一就是值类型和引用类型的区别。下面我们来看一下在 JavaScript 中基本数据类型(Primitive Types)和引用类型(Reference Types)的区别。、

基本类型和引用类型

ECMAScript包含两个不同类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段;引用类型值指由多个值构成的对象。当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值。

常见的五种基本数据类型是:

Undifined、Null、Boolean、Number和String。这五种基本数据类型可以直接操作保存在变量中的实际值。

看下面例子:

?


1

2

3

4

5

6

7

8

9

var a = 10;

var b = a;

b = 20;

console.log(a); // 10

var bl = true;

var bl1 = bl;

bl1 = false;

console.log(bl); // true

上面,b获取值是a值的一份拷贝,虽然,两个变量的值是相等,但是两个变量保存两不同的基本数据类型值。b只是保存了a复制的一个副本。所以,当b的值改变时,a的值依然是10;
下面,两个Boolean变量bl和bl1同样是基本数据类型,同样保存两个不同的基本数据据类型值,bl1保存bl复制的一个副本。

下图演示了这种基本数据类型赋值的过程:

下面看一下引用类型数据:

javascript引用数据类型是保存在堆内存中的对象,与其它语言不同的是,你不可以直接访问堆内存空间中的位置和操作堆内存空间。只能通过操作对象的在栈内存中的引用地址。所以引用类型的数据,在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存在堆内存中的对象。

看下下面的例子:

?


1

2

3

4

var obj1 = new Object();

var obj2 = obj1;

obj2.name = "我有名字了";

console.log(obj1.name); // 我有名字了

由上面例子,我们声明了一个引用数据类型变量obj1,并把它赋值给了另外一个引用数据类型变量obj2。当我们obj2添加了一个name属性并赋值"我有名字了"。obj1同样拥有了和obj2一样的name属性。说明这两个引用数据类型变量指向同一个堆内存对象。obj1赋值给obj2,实际只是把这个堆内存对象在栈内存的引用地址复制了一份给了obj2,但它们本质上共同指向了同一个堆内存对象。

下面我们来演示这个引用数据类型赋值过程:

自然,给obj2添加name属性,实际上是给堆内存中的对象添加了name属性,obj2和obj1在栈内存中保存的只是堆内存对象的引用地址,虽然也是拷贝了一份,但指向的对象却是同一个。故而改变obj2引起了obj1的改变。

一般而言,基本数据类型是有固定数目的字节组成,这些字节可以在解析器的较底层进行操作比如Number和Boolean;而引用数据类型,可以包含任意数目的属性和元素,因此它们无法像基本数据类型那样很容易的操作。由于,引用数据类型的值是会发生变化的,所以通过跟基本数据类型一样的值传递方式,也就没什么意义了,因为会牵涉到大量的内存的复制和比较,效率太低。所以引用数据类型是通过引用传递方式,实际传递的只是对象的一个地址。比如Array和Function因为它们都是特殊的对象所以它都是引用类型。另外,引用类型是可以添加属性,基本类型虽然也可以添加属性,也不会报错,经测试添加完之后却是无法访问的。

看下面代码:

?


1

2

3

var a = 12;

a.name = "myname";

console.log(a.name); // undefined

String一个特殊的基本数据类型

在很多语言中,String是以对象的形式表示的,但在ECMAScript里没有沿用这种传统,String是当作一种基本数据类型,但它是一个比较特殊的基本类型。

看上去好像String应该做为一个引用类型,可实际上它不是,因为它不是对象。那么看起来它应该是基本数据类型,应该是通值传递的方式来操作。

看下面例子:

?


1

2

3

4

var stra = "这是一个字符串";

var strb = stra;

stra = "这是另外一个字符串";

console.log(strb); // 这是一个字符串

上面例子我们看到,仿佛stra通过值传递的方式复制了一份给了strb。当stra改变的时候,strb并没有改变,似乎我们已经可以下结论,String就是个基本数据类型。

可是,因为String是可以任意长度的,通过值传递,一个一个的复制字节显示效率依然很低,看起来String也可以当作引用类型。

看下面例子:

?


1

2

3

var a = "myobject";

a.name = "myname";

console.log(a.name); // undefined

显示String无法当作一个对象来处理。实际上,javascript里的String是不可以改变的,javascript也没有提供任何一个改变字符串的方法和语法。

?


1

2

3

var a = "myobject";

a = a.substring(3,5)

console.log(a); // bj

记住这样做,就没有改变String字符串"myobject",只a引用了另一个字符串"bj","myobject"被回收了。

所以可以这样讲,String实际上并不符合上面两种数据类型分类。它是具有两方面属性介于两都之间的一种特殊类型。

以上所述就是本文的全部内容了,希望大家能够喜欢。

时间: 2024-08-08 09:40:43

javascript中基本类型和引用类型的区别分析的相关文章

[转]javascript中基本类型和引用类型的区别分析

基本类型和引用类型 ECMAScript包含两个不同类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段:引用类型值指由多个值构成的对象.当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值. 常见的五种基本数据类型是: Undifined.Null.Boolean.Number和String.这五种基本数据类型可以直接操作保存在变量中的实际值. 看下面例子: ? 1 2 3 4 5 6 7 8 9 var a = 10; var b = a;    

javascript中基本类型和引用类型的差别

代码1:var a=3.14;var b=a;a=4;alert(b); 代码2var a=[1,2,3];var b=a;a[0]=99;alert(b); 请问为什么代码1显示的是3.14 ,为什么a的值并没有改变呢?明明在执行了第二行代码之后又给a重新赋值了.难道是因为第一行给a赋的值是基础类型的数值 不能被改变么?那为什么代码2 显示的值是99,2,3,为什么a的值变了 ,是因为数组是引用类型的,引用类型没有固定大小 ,它并不能真正赋值给谁,而只是赋值给了b一个引用的形式.告诉变量b哪里

简单分析JAVASCRIPT的基本类型和引用类型

由于最近项目当中使用EXTJS这样一种前端框架,所以就离不开JavaScript得使用,所以最近我就在自己研究学习JavaScript,目的是为了方便开发的顺利进行.但是在实际开发当中,我发现JavaScript是一门很简单就能上手的语言,但是真正使用起来我们就会发现他作为一门弱类型的语言,从某种角度来看可能是一个既有趣有强大的功能,但是也是容易出问题的特性. 楼主本人也是处于学习这门语言当中,所以写一篇博客也是为了巩固自己的知识,同时也是为了和大家一起分享我对于学习当中一些大家都用过但是不一定

javascript 数据类型(基本类型和引用类型的定义和区别)

ECMAStript变量包含两种不同类型的值,基本类型和引用类型. 基本类型:指的就是保存在栈内存中的简单数据段. 引用类型:指的是那些保存在堆内存中的对象,换句话说,就是变量名实际上是一个指针,而这个指针指向的位置,就是保存对象的位置. 两种不同的访问方式 基本类型:按值访问,操作的是它们实际的值. 引用类型:按引用访问,当查询时,我们需要先从栈中读取内存地址,然后按照指针所指向的地方,找到堆内存里面的值. 基本类型 基本的数据类型有:`undefined,boolean,number,str

JavaScript—基本类型和引用类型的区别

在看js高级程序设计时,发现这部分虽然简单,但是我自己有些地方经常混淆,总结如下: (一)基本概念 JS中可以把变量分成两部分,基本类型和引用类型. 基本类型比较简单,包括:Undefined.Null.Boolean.Number和String,基本类型值就是简单的数据段:引用类型值可能由多个值构成的对象. 引用类型值保存在内存中,而JS是不能直接访问内存的,所以对于引用类型,操作的不是实际的对象而是对象的引用. (二)基本类型值和引用类型值的区别 a.动态属性 只能给引用类型值动态的添加属性

js中函数参数基本类型和引用类型的区别

高级程序设计中说明,所有函数的参数都是按值传递的. 基本类型 向参数传递基本类型的值时,被传递的值会被复制给对应的命名参数 function addTen(num){ num=+10; return num; } var count=20; var result=addTen(count); alert(count);//20 在函数内部,num的值被加上10,但不影响外部count变量的值 引用类型 在向参数传递引用类型的值时,把这个值在内存中的地址复制给对应的局部变量,如果这个局部变量没有重

Javascript手记-基本类型和引用类型

1:ecmascript包含2中不同的数据类型,基本数值类型和引用数值类型.基本数据类型是简单的数据段,引用类型是指那些可能由多个值构成的对象. 1.1:常用的基本类型:Undefined,Null,Boolean,Number,String 1.2:引用类型的值是保存在内存中的对象.与其它语言不同,javascript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,再 操作对象时实际是操作对象的引用而不是操作实际的对象. 2:复制变量值 2.1:eg:var numA=5; v

JavaScript的基本类型和引用类型的值。

ECMAScript变量包含两种数据类型的值:基本类型值和引用类型值. 在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值. 基本类型:string,number,boolean,undefined和null.      基本类型值:简单的数据段,保存在栈内存中同时占有固定大小的空间,按值访问,因此可以操作保存在变量中的实际的值. 引用类型:Object,Array,Date     引用类型值: 由多个值构成的对象,在栈内存中变量保存的实际上是一个地址,这个地址指向堆内存中所

javascript中callee与caller的区别分析

callee callee是对象的一个属性,该属性是一个指针,指向参数arguments对象的函数 首先我们来写个阶成函数: function chen(x){ if (x<=1) { return 1; } else{ return x*chen(x-1); }; }; 从这个函数中可以看出来,用到了递归函数,要是改变了函数名,里面的函数名也要随着改变,这样很不方便所以我们用callee来试试 function chen(x){ if (x<=1) {return 1; }else{ ret