手机版

JavaScript中值类型和引用类型的区别

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

JavaScript的数据类型可以分为两类:原语类型和对象类型。其中,原始类型包括数字、字符串和布尔值。此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不是字符串,也不是布尔值。它们通常代表各自特殊类型的独特成员。在JavaScript中,除了数字、字符串、布尔值、空值和未定义之外,它们都是对象。

JavaScript中值类型和引用类型的区别

JavaScript中值类型的值是不可变的:

没有任何方法可以更改值类型的值。数字、布尔值、null和undefined都是不可变的类型。例如,修改数值的内容是没有意义的。虽然一个字符串可以被视为一个字符数组,但它也可以被视为可变的。但是,在JavaScript中,字符串是不可变的。在实际操作过程中,可以在字符串中的任何地方访问文本,单独的JavaScript并不能提供修改已知字符串文本内容的方法。

代码:

var str=' abcdefconsole . log(str . touppercase());//abcdefconsole . log(str);//abcdef显示原来的字符串值没有变化,仍然是小写的abcdef。第二行代码只在调用字符串的toUpperCase()方法后返回一个新字符串。

JavaScript中引用类型的值是可变的:

代码:

Var学生={姓名: '张三',年龄:26 };console . log(student . name);//张三学生名='李四';console . log(student . name);//李四的问题:如果像studen.name='李四'这样对str做同样的运算,str的值不是变了吗?

扩展:如果字符串被重新赋值,改变的是变量值,字符串被重新赋值。它不改变字符串的内容,只改变变量字符串的内容

JavaScript中的值类型不能添加属性和方法:

代码:

Var学生='张三';学生年龄=26岁;student . run=function(){ console . log(' running . ');} console . log(student . age);//undefinedconsole . log(student . run);//未定义从代码示例中可以知道,属性和方法不能添加到值类型中。因此,这也表明值类型是不可变的。

可以在JavaScript中将属性和方法添加到引用类型中:

代码:

var student={ };学生年龄=26岁;student . run=function(){ console . log(' running . ');} console . log(student . age);//26 console . log(student . run);/* function(){ console . log(' running . ');} */JavaScript中值类型的变量存储在堆栈区域:

下表模拟了JavaScript中值类型的变量存储结构。堆栈区域包括变量的标识符和相应的变量值。

JavaScript中的引用类型变量也存储在堆栈区域。不同之处在于引用类型将变量标识符和变量对应的值的引用地址存储在堆栈区域,而变量对应的值存储在堆区域:

因此,可以看出,即使两个对象完全相同,堆区域中的存储地址也是不同的,因此在比较时并不相等。

JavaScript中值类型的比较是值的比较:

在JavaScript中比较值类型时,只有当它们的值相等时,它们才相等。注:比较时注意“==”和“===”。双等号(==)在比较时做了类型转换,而全等号(===)是值和类型的比较。只有当值和类型同时相等时,它们才能相等。

代码:

var student 1=“{ }”;var student 2=“{ }”;console . log(student 1===student 2);//true两个相同字符串的比较是值(“{}”)的比较,它们是完全相等的。

JavaScript中引用类型的比较就是引用地址的比较:

代码:

var student 1={ };var student 2={ };console . log(student 1===student 2);//false可以看出两个空对象并不相等。

问题:为什么两个相同的物体不相等?

扩展:因为引用类型是根据引用地址来访问的,引用类型的比较实际上是比较堆内存中两个对象的地址是否相同,所以很明显,堆内存中student1和student2的地址是不同的,所以即使看到两个相同的对象,也不一定相等。

JavaScript中值的变量赋值值得复制:

在JavaScript中赋值值类型变量的过程中,当从一个变量向另一个变量赋值基本类型(值类型)时,会在变量上创建一个新值,然后复制到为新变量分配的位置:

代码:

var str1=' abcdefvar str2=str1str1=' abcconsole . log(ST R1);//ABC console . log(str 2);//abcdef从上面的代码示例可以看出,存储在str1中的值是abcdef。当使用str1初始化str2时,存储在str2中的值也是abcdef,但str2和str1中的值是完全独立的,str2的值只是str1中值的副本。接下来,这两个变量可以参与任何操作,而不会相互影响。事实上,在分配了变量的基本类型后,这两个变量是相互独立的,不受影响。

在JavaScript中赋值引用类型变量的过程中,从一个变量到另一个变量赋值引用类型时,也会在变量上创建一个新的“值”,然后将“值”复制到为新变量分配的位置。不同的是,被复制的不是真正的“值”,而是堆区域中真正值的存储地址:

代码:

var student 1={ age : 26 };var student2=student1student2.age=100console . log(student 1 . age);//100 console . log(student 2 . age);//100 console . log(student 2===student 1);//true引用类型的赋值实际上是对象在栈区保存的地址指针的赋值。如果两个变量保存同一个对象地址,那么两个变量指向同一个对象。因此,改变任何一个变量都会相互影响。

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!

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