【JS系列2】JavaScript 变量
1. 命名
1-1 方法
- 匈牙利命名法:变量名 = 类型 + 对象描述;Int整型 i 、Float浮点 fl 、Boolean布尔 b 、String字符串s 、Array数组 a 、Object对象 o、Function函数 fn、Regular Expression正则 re
- 驼峰命名法: ①全部小写 单词与单词间用下划线表示 ②大小写混合: 大驼峰——每个单词首字母大写 小驼峰——第一个单词首字母小写,其它单词首字母大写
1-2 规则
- 首字符:英文字母或下划线
- 组成:英文字母、数字、下划线
- 禁忌:JavaScript关键字与保留字
2. 声明
2-1 显式声明
- var 变量名
2-2 陋习
- 没有类型
- 重复声明
- 隐式声明
- 不声明直接赋值
2-3 正解
- 先声明,后读写
- 先赋值,后运算
3. 变量类型
3-1 值类型
- 占用空间固定,保存在栈中
- 保存与复制的是值本身
- 使用typeof检测数据的类型
- 基本类型数据是值类型
3-2 引用类型
- 占用空间不固定,保存在堆中
- 保存与复制的是指向对象的一个指针
- 使用instanceof检测数据的类型
- 使用new()方法构造出的对象是引用类型 注:在js中, (1)值类型:数值、布尔值、null、undefined (2)引用类型:对象、数组、函数
4. 作用域
4-1 全局变量
- 包含:在函数体外定义的变量、在函数内定义的无var的变量
- 调用:任意位置
4-2 局部变量
- 包含:在函数内使用var声明的变量、函数的形参
- 调用:当前函数内部
4-3 优先级
- 局部变量高于同名全局变量
- 参数变量高于同名全局变量
- 局部变量高于同名参数变量
4-4 特性
- 忽略块级作用域
- 全局变量是全局对象的属性
- 局部变量是调用对象的属性
- 作用域链: ①内层函数可访问外层函数的局域变量 ②外层函数不能访问内层函数的局域变量
- 声明周期: ①全局变量——除非被显式删除,否则一直存在 ②局部变量——自声明起至函数运行完毕或显式删除 ③回收机制——标记清除、引用计数
注:
- 标记清除
- 标记清除简单的来说就是给各个变量名打上 YES or NO的标签以供JS引擎进行处理(当然打什么标签自己理解即可)。在和执行上下文类似的的环境中当变量名称进入环境的时候,那么变量会被打上 YES。一般来说是绝对不会释放被打上 YES 标签的变量内存的,一旦变量在出了该环境时,变会被打上 NO 标签(和作用域貌似有点像),JS引擎会在一定时间间隔或者设置的时间来进行扫描,对NO标签的进行剔除以释放其内存。
- 引用计数(查了很多资料,还是无法找到其真正的计算方式)
- 一般来说,引用计数的含义是跟踪记录每个值被引用的次数。当声明一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数便是1,如果同一个值又被赋给另一个变量,则该值的引用次数加1,相反,如果包含对这个值引用的变量又取得了另一个值,则这个值的引用次数减1。当这个值的引用次数为0时,说明没有办法访问到它了,因而可以将其占用的内存空间回收。
- 对于引用计数,我们需要知道如果具有循环引用,那么其计数问题就会暴露,导致计数永远不为0而无法释放内存,导致内存泄露,具体事例如下,如果e.g.1使用引用计数的话就会导致问题,内存无法被释放,导致内存无故消耗占用。