ES3定义变量

  • var
  • function

ES6定义变量

  • let
  • const
  • class
  • import 导入模块

    let&const VS var 区别:

    1.变量提升

    .var:存在变量提升

    1. console.log(n);//undefined
    2. var n=20;
    3. console.log(n);

    .let&const 不存在变量提升

    - 所以变量只能在声明定义后使用,代码执行阶段遇到变量 在后面声名 会报无法在前面使用错误
    
    console.log(a);//ReferenceError: Cannot access 'a' before initialization
    let a=20;
    

    2.和GO的关系「前提:全局上下文」

    .var/function

  • 在全局上下文中基于var/function声明的变量直接放到GO中;(如果是获取未声明的变量:报错;如果是直接赋值未声明的变量,相当于给window(GO)加属性)

    .const/let

  • 在全局上下文中基于const/let声明的变量放到全局VO(G)中

    3.重复声明:

    var/function

    • 在语法上允许重复声明,但浏览器在实际运行中不会重新声明,而是重新赋值

      let/const

    • 在词法分析阶段,在语法上就不允许重复声明,下面代码都不会执行

      4. 块级作用域

      var

      var与块级上下文没有关系,不受{}束缚,只出现var不会生成块级作用域

      let/const/function

      除函数、对象的{}【例如循环体、判断体…】如{}内出现let/const/function,都会产生块级上下文,也会受块级上下文束缚【function有特殊性】

      5. 暂时性死区

console.log(a); //报错
console.log(typeof a); //"undefined" 基于typeof检测一个未被声明的变量,不会报错,结果是“undefined” => 你可以理解为这是浏览器的一个BUG「暂时性死区」

//==================
console.log(typeof a); // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 10;

let VS const

  • 变量:我们声明出来的名字「存储在VO/AO中的」
  • 常量:具体值
  • let/const声明的都是“变量”
    • const声明的变量有一个特点:“不能修改它的关联指向,一但和某个值关联,则不能再和其他值关联了”
    • const关联指向的值不能修改,但是如果是引用数据类型,可以修改地址内的内容
let a = 12;
a = 13; //让变量a重新和13关联
console.log(a); //13 

//===========================
const b = 12;
b = 13; //Uncaught TypeError: Assignment to constant variable.  const声明的变量有一个特点:“不能修改它的关联指向,一但和某个值关联,则不能再和其他值关联了”
console.log(b); */

//================================
const b; //Uncaught SyntaxError: Missing initializer in const declaration  并且const声明的变量,必须设置初始值

//=============================
//const关联指向的值不能修改,但是如果是引用数据类型,可以修改地址内的内容
const b = {
    name: '馒头'
};
b.name = '包子';
console.log(b);