变量声名
- 基本类型
- 当我们声名一个基本类型时,值会保存在栈空间中
- 引用类型
- 当我们声名一个引用类型时,对象保存在堆空间中,但是地址保存在栈空间中
- 当我们声名一个引用类型时,对象保存在堆空间中,但是地址保存在栈空间中
变量引用
- 当变量是一个基本类型时,直接读取栈中保存的值就是我们想要的
- 名字 ——> 数据
- 当变量时一个引用类型时,读取到栈中的值只是一个地址,需要通过这个地址来得到我们想要的数据
- 名字 ——> 数据(地址) ——> 数据
变量传递
- 不论是基本类型还是引用类型,变量传递的值都是栈中的数据(值)
a的值拷贝给了a1 ,栈中为a1新开辟了空间来保存a1的值,由于是基本类型,所以两个变量的调用互不影响
b的值拷贝给了b1, 栈中为b1新开辟了空间来保存b1的值,由于是引用类型,虽然b和b1在栈中都有自己的空间,但是他们的值都是指向同一个堆内存,最终的修改都会影响到堆中的对象
这样看就可以得出一个结论,js中变量的传递都是对栈中保存的值的传递,基本类型传递的是它自身的值,引用类型传递的是保存的地址(栈中的值)
参数的传递
- 知道函数预解析的肯定知道参数在函数中相当于声明的局部变量,那么将基本类型的值当作参数传入就相当与 上面的 a1 = a,
- 引用类型当作参数传入相当与上面的b1 = b,都是将栈中值进行相互的传递
最后总结
- 值类型的值在栈空间存储,引用类型的对象在堆中存储,地址在栈中存储
- js中变量和参数的传递,都是按值传递(栈中的值)
- 基本类型就像现金直接就可以使用,引用类型就像存折,要先到银行再取出现金来用
最后的小知识
1. 变量:变量表示一个存放数据的内存地址,通过变量名可以取得该内存中的存储值。
2. 值: 变量所表示的内存地址中存放的数据。
3. 值的类型:变量绑定的那块内存里放的数据应该如何去解释,或者说如何解码,js中可分为两种数据类型,基本类型(值类型)与引用类型,基本类型就是你通过变量标识符从内存中取出的数据就是你想要的那条数据,引用类型就是当你通过变量标识符从内存中取出的数据并不是你想要的数据,而是你目标数据的一个地址,一个指针