基本类型和引用类型。
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实际上并不符合上述两种数据类型的分类。它是一种特殊类型,中间有两个属性。
以上就是本文的全部内容,希望大家喜欢。