ES3定义变量
- var
- function
ES6定义变量
- let
- const
- class
-
let&const VS var 区别:
1.变量提升
.var:存在变量提升
console.log(n);//undefined
var n=20;
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
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);