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,如图:
let b = a a赋给b其实就是把a的地址赋给b
所以b会打印20