javascript原始值和引用值类型及区别

Posted clearYang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript原始值和引用值类型及区别相关的知识,希望对你有一定的参考价值。

原始值和引用值类型及区别

首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变。

原始值(简单数据类型)

存储在栈中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。包含五种:undefined,null,boolean,number和string,可以通过typeof来判断某数据是何简单数据类型。

引用值(复杂数据类型)

存储在堆中的对象,放在变量的栈空间中的值是该对象存储在堆中的地址,也就是说,存储在变量处的值是一个指针(内存地址),指向存储对象的堆内存中,包含Object,array,function等

区别:1.简单数据类型的值是储存在栈中,当把一个变量传递给另一个变量时,是把一个栈中的东西复制到另一个栈中,并且这两个变量互不影响,修改其中的变量值时不会改变另一个变量的结果。

var a=10
var b=a
a=1
console.log(b)//10

2.引用值是把引用变量的名称存储在栈中,但是把实际对象存储在堆中,栈中的内存地址指向堆中的实际对象,当把引用对象传递给另一个变量时,复制的其实是指向实际对象的指针(内存地址),此时两者指向的是同一个数据,若通过方法改变其中一个变量的值,则另一个变量的值也会改变,因此,js中对象的复制是默认引用赋值的。

const obj1=
        name:\'xiaoming\'

const obj2=obj1
obj2.name=\'xiaohong\'
console.log(obj1)//xiaohong

也是因为上述特点,es6中,const是声明常量的,赋值后,该值不可改变。

const PI=3.14

PI=2.14//报错

console.log(PI)

//但是
const obj1=
        name:\'xiaoMing\'


obj1.name=\'xiaoHong\'
console.log(obj1.name)//xiaoHong

这也是因为,const声明的obj1指向的是栈中的内存地址,此地址不可被修改,但是堆中存储的数据它是管不着的。

小明的妈妈让小明看门,家里的东西被偷光了,门还在。

如果你想复制赋值,另外一个值不会随它改变而改变,则必须重新分配对象,此时,该值的原指针(内存地址)改变,则另外一个值不会随它的改变而改变。

var obj1=
        name:\'xiaoMing\'

var obj2=Object.assign(,obj1)

obj2.name=\'xiaoHong\'
console.log(obj1)
console.log(obj2)

 

以上是关于javascript原始值和引用值类型及区别的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的原始值和复杂值

《javascript高级程序设计》学习笔记 | 4.1.原始值与引用值

JavaScript中原始值和引用值传递

前端JS面试

关于javascript内存分配

javaScript的引用值和原始值的存放位置