变量
JS变量可以保存两种类型的值:基本类型值和引用类型值;它们具有以下特点:
1.基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
2.从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;
3.引用类型的值是对象,保存在堆内存中;
4.包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
5.从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向用一个对象;
6.确定一个值是哪种基本类型可以使用typeof操作符;而确定一个值是哪种引用类型可以使用instanceof操作符;
作用域
所有变量都存在于一个执行环境(作用域)中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量;
1.执行环境有全局执行环境和函数执行环境之分;
2.每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;
3.函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其父环境,乃至全局环境;
4.变量的执行环境有助于确定应该合适释放内存;
内存
JS自动垃圾收集机制
1.离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除;
2.为了确保有效地回收内存,应该及时解除不再使用的全局对象或者全局对象属性以及循环引用变量的引用;
JS基本类型
基本的数据类型有:`undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。
基本类型有以下几个特点:
- 基本类型的值是不可变得
- 基本类型的比较是值的比较
- 基本类型的变量是存放在栈区的(栈区指内存里的栈内存)
引用类型
- 引用类型的值是可变的
- 引用类型的值是同时保存在栈内存和堆内存中的对象(引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。)
- 引用类型的比较是引用的比较
对象引用
当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。前面讲引用类型的时候提到,
保存在变量中的是对象在堆内存中的地址,所以,与简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值操作后,
两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响