数据类型中原始类型和引用类型的区别

172 阅读2分钟

JavaScript 中的数据类型可以分为原始类型和引用类型。原始类型的值直接存在调用函数栈;而引用类型的值则存在堆中,调用栈中存放的只是堆中的引用地址。

区别一

//原始类型
 let num = 123
let str = "hello"
let flag=true
let un = undefined
let nu = null 

这些原始类型的值在调用栈中占据固定的内存空间,不能有属性和方法。

//引用类型  
 let obj = {}
let fn = function(){}
let arr = []
let date = new Date() */

这些引用类型的值存放在堆中,调用栈中存放的只是堆中的引用地址。通过引用地址,我们可以访问和操作堆中的实际对象。

区别二

 let a = 1
let b = a
a = 2
console.log(b);

使用原始类型这段代码会打印:1。毫无疑问。

let a={
    age:18
}
let b = a     /* a赋给b其实就是把a的地址赋给b */
 a.age = 20   /* 找到a的地址并赋值20 */
console.log(b.age);  

想想这段代码会打印什么?


答案是20
为什么不是18呢?

那是因为代码被 编译后先把对象{}赋给a,但是所有的引用类型都不能放进调用栈, [因为它可能非常大会爆栈。如果调用栈很大并且放了很多函数, 函数就会执行很慢(口袋里面放了很多东西就不好找要用的东西)]。 所有v8引擎会创建一个“堆”,(它内存非常大,取决于自己的计算机的性能). 把引用类型{}存入堆,赋予一个引用地址并把地址1107赋给a,如图:

2.(1).png let b = a a赋给b其实就是把a的地址赋给b

2(2).jpg 所以b会打印20