【JavaScript知识点二】JavaScript 变量

【JavaScript知识点二】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 特性

  • 忽略块级作用域
  • 全局变量是全局对象的属性
  • 局部变量是调用对象的属性
  • 作用域链:
    ①内层函数可访问外层函数的局域变量
    ②外层函数不能访问内层函数的局域变量
  • 声明周期:
    ①全局变量——除非被显式删除,否则一直存在
    ②局部变量——自声明起至函数运行完毕或显式删除
    ③回收机制——标记清除、引用计数

注:
1.标记清除
标记清除简单的来说就是给各个变量名打上 YES or NO的标签以供JS引擎进行处理(当然打什么标签自己理解即可)。在和执行上下文类似的的环境中当变量名称进入环境的时候,那么变量会被打上 YES。一般来说是绝对不会释放被打上 YES 标签的变量内存的,一旦变量在出了该环境时,变会被打上 NO 标签(和作用域貌似有点像),JS引擎会在一定时间间隔或者设置的时间来进行扫描,对NO标签的进行剔除以释放其内存。
2.引用计数(查了很多资料,还是无法找到其真正的计算方式)
一般来说,引用计数的含义是跟踪记录每个值被引用的次数。当声明一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数便是1,如果同一个值又被赋给另一个变量,则该值的引用次数加1,相反,如果包含对这个值引用的变量又取得了另一个值,则这个值的引用次数减1。当这个值的引用次数为0时,说明没有办法访问到它了,因而可以将其占用的内存空间回收。
对于引用计数,我们需要知道如果具有循环引用,那么其计数问题就会暴露,导致计数永远不为0而无法释放内存,导致内存泄露,具体事例如下,如果e.g.1使用引用计数的话就会导致问题,内存无法被释放,导致内存无故消耗占用。

e.g.1
function(){
var a = {};
var b = {};
b.pro = a;
a.pro=b;
}
原文地址:https://www.cnblogs.com/reamd/p/4944062.html