目的:
1、如果不了解存储位置在程序中可能出现出乎意料的值改变
2、可以很好的了解闭包
3、可以对性能优化有一定分析能力提升
js的数据类型
js基础类型:undefined、null、boolean、string、number
js的引用类型:array、function、object
es6提供新的数据结构:set、map
堆内存和栈内存
栈内存:效率更高,能申请的空间较小
堆内存:效率更低,能申请的空间更大
不同类型的存储位置
基础类型是在栈内存空间
引用类型的引用地址在栈内存空间
内存地址指向的值在堆内存空间
不同类型在传递过程中的区别
直接上代码
let a = 1 let b = a b = 2 console.log(a,b);//1,2 let obj1 = {a:'1'} let obj2 = obj1 obj2.a = '2' console.log(obj1,obj2);//{a:'2'},{a:'2'}
上边代码中b=a是重新开辟一个栈空间存放b变量,所以a和b都是独立的内存空间
而obj1和obj2的赋值只是开辟了一个新的栈内存,里边放的还是obj1的引用地址,两个都是指向堆内存中的{a:'1'}
所以改变obj2时改变的实际上是堆内存中变量,所以obj1也随着变化了
函数间传递
function setTest(){ let s = new Set([1,2,3]) changeSet(s) console.log(s);//Set(2){1,2} let arr = [1,2,3] changeArr(arr) console.log(arr);//[1,5,3] } function changeSet(set){ set.delete(3) } function changeArr(arr){ arr[1] = 5 } setTest()