## 大连科技
自己整理的,不一定正确,思路也比较乱!欢迎指正!
先讲清楚几个概念!
变量:变量是一个名字。它绑定了一块内存(堆内存)!
变量值:存储在变量那块内存中的数据!数据基本可以分为两种,基本数据类型和引用数据类型。(函数也相当于一组变量和变量值(键值对),函数名就是一个变量。而变量值是那个函数的地址引用)
对象:不能被变量直接绑定,而是要通过引用来间接绑定的数据就是对象(函数也是对象,"万物皆对象")。而且对象数据与非变量数据相比有一个特点,即它是有内部结构的,即属性。
1、变量—>数据
2、变量—>数据(地址)—>数据(对象、函数)
总结一下就是:变量是一个名字,它绑定一块存储空间,这个空间要么放数据,要么放数据的地址(或者某种引用)
基础数据类型(undefined、null、boolean、number、string)都是按值访问的。按值访问相当于将变量中的数据进行一次拷贝,给新的变量,原变量改变后,按值访问的不会变化!
引用数据类型(对象、函数)是按引用访问的!引用数据类型存储在变量中的值是保存在堆内存中的对象的地址。JS不允许直接访问堆内存中的对象?因此我们不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。
简单说就是:变量绑定的那块内存里放的数据,并不是我真正想要的数据,它是一个元数据、一个地址,一个指向我真正想用的数据的位置的指针。
当我们要访问堆内存中的引用数据类型时,实际上我们首先是从变量中获取了该对象的地址引用(指针),然后再从堆内存中取得我们需要的数据!
下面这个例子,b 等于的是 a 对象的引用,而不是把整个 a 对象复制给 b, 因此b a 指向的是同一个对象,所以b改动了对象的值,a指向的对象的值也改变了!
另外一个例子
当对象被当参数传递时,传的是该对象的地址引用!(为了证明对象是按值传递的!传递!传递!不是访问!引用类型按引用访问,按值传递! 基本数据类型则都是按值传递和按值访问!)