手机版

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

时间:2021-11-06 来源:互联网 编辑:宝哥软件园 浏览:

基本类型和引用类型。

ECMAScript包含两种不同类型的值:基本类型值和引用类型值。基本类型值是指简单的数据段;引用类型值是指由多个值组成的对象。当我们将一个变量赋给一个变量时,解析器应该做的第一件事是确认该值是基本类型值还是引用类型值。

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

未定义、空、布尔、数字和字符串。这五种基本数据类型可以直接操作变量中存储的实际值。

请看下面的例子:

var a=10var b=a;b=20console . log(a);//10 var bl=true;var bl1=blbl1=假;console . log(bl);//true以上,b得到的值是a的值的副本,虽然两个变量的值相等,但是两个变量持有两个不同的基本数据类型值。b只是保留了一份A的副本。因此,当b的值改变时,a的值仍然是10;接下来,两个布尔变量bl和bl1也是基本数据类型,它们也保存两个不同的基本数据类型值,bl1保存bl复制的副本。

下图说明了这种基本数据类型的分配过程:

让我们看看引用类型数据:

javascript引用数据类型是存储在堆内存中的对象。与其他语言不同,您不能直接访问堆内存空间中的位置并操作堆内存空间。您只能在堆栈内存中操作对象的引用地址。因此,保存在堆栈内存中的实际上是堆内存中对象的引用地址。有了这个引用地址,您可以快速找到存储在堆内存中的对象。

请看下面的例子:

var obj1=新对象();var obj2=obj1Obj2.name='我有名字';console . log(obj 1 . name);//我有名字。从上面的例子中,我们声明了一个引用数据类型变量obj1,并将其分配给另一个引用数据类型变量obj2。当我们向obj2添加一个名称属性并赋值“我有一个名称”时。Obj1也具有与obj2相同的名称属性。解释这两个引用数据类型变量指向同一个堆内存对象。obj1到obj2的赋值只是将堆栈内存中这个堆内存对象的引用地址复制到obj2,但它们本质上是一起指向同一个堆内存对象。

让我们演示这种参考数据类型的分配过程:

自然,将name属性添加到obj2实际上是将name属性添加到堆内存中的对象。obj2和obj1仅将堆内存中对象的引用地址存储在堆栈内存中,虽然它们也被复制,但它们指向同一个对象。因此,改变obj2会导致obj1的改变。

一般来说,基本数据类型由固定数量的字节组成,可以在解析器的下层操作,如Number和Boolean;引用数据类型可以包含任意数量的属性和元素,因此它们不能像基本数据类型那样容易操作。因为引用数据类型的值会发生变化,所以像基本数据类型一样传递值是没有意义的,因为会涉及大量的内存复制和比较,效率太低。因此,引用数据类型是通过引用传递的,实际上只传递了对象的一个地址。例如,数组和函数都是引用类型,因为它们是特殊的对象。此外,引用类型可以添加属性。虽然基本类型也可以在不报告错误的情况下添加属性,但在测试和添加后无法访问。

请看下面的代码:

var a=12a.name=' mynameconsole . log(a . name);//undefinedString是一种特殊的基础数据类型。

在许多语言中,字符串被表示为一个对象,但是在ECMAScript中没有遵循这个传统。字符串被认为是一种基本数据类型,但它是一种特殊的基本类型。

似乎String应该作为引用类型使用,但实际上不是,因为它不是对象。好像应该是基础数据类型,应该是以传值的方式操作。

请看下面的例子:

Var stra='这是一个字符串';var strb=straStra='这是另一个字符串';console . log(strb);//这是一个字符串。从上面的例子中我们可以看到,似乎stra通过价值转移的方式复制了一个副本到strb。当stra改变时,strb没有改变。似乎我们已经可以断定字符串是一种基本的数据类型。

但是由于String可以是任意长度,通过值传输逐个复制字节的显示效率还是很低的,所以似乎String也可以作为引用类型。

请看下面的例子:

var a=' myobjecta.name=' mynameconsole . log(a . name);//undefined表示字符串不能被视为对象。实际上,javascript中的string是不能改变的,javascript也没有提供任何改变String的方法和语法。

var a=' myobjecta=a.substring(3,5)console . log(a);//bj请记住,这样做不会改变String字符串“myobj”,只有一个引用了另一个字符串“bj”,并且“myobj”已被回收。

因此,可以说String实际上并不符合上述两种数据类型的分类。它是一种特殊类型,中间有两个属性。

以上就是本文的全部内容,希望大家喜欢。

版权声明:javascript中基本类型和引用类型的区别分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。