let/const && var的区别

215 阅读2分钟

(let/const) && var的区别

1. let 不存在变量提升,不允许在定义之前使用

console.log(a); //=>undefined
var a = 12;
console.log(b) //=>Uncaught ReferenceError: Cannot access 'b' before initialization
let b = 13 

2. let不允许重复声明【不论当前上下文中,基于何种方式声明过这个变量,都不允许基于let再次声明】

// Uncaught SyntaxError: Identifier 'a' has already been declared 在词法解析阶段,
// 发现有基于let重复声明,词法解析就报错了,所以JS代码都不会执行
console.log('OK');
var a = 12;
let a = 13; 

3. 在全局上下文中,基于var/function声明的变量,是给window(GO)设置的全局属性;基于let/const

声明的变量是放在VO(G)中的,和GO没有任何关系

var a = 12;
let b = 13;
console.log(a); // 先看VO(G)中有没有,没有则继续看GO中是否存在... 12
console.log(window.a); // 直接到GO中查找 12
console.log(b); // 13
console.log(window.b); // undefined
console.log(c) // Uncaught ReferenceError: c is not defined
d = 100; // 先看VO(G)中是否存在d,如果存在则修改全局变量值,如果不存在,则直接给GO设置d的属性(或者修改GO中d的属性值)
console.log(window.d); // 100

4. let会产生块级上下文

{
  var a = 12;
  let b = 13;
  console.log(a, b); // 12 13
}
console.log(a); // 12
console.log(b); // Uncaught ReferenceError: b is not defined  b是块级上下文中所有的

5. let的暂时性死区问题

console.log(typeof a); // "undefined" 基于typeof检测一个未被声明的变量,结果不会报错,而是“undefined”

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

let && const 的区别

const声明的是敞亮,这句话是不准确的,他声明的还是变量;基于const声明的变量,首先必须赋值初始值,而且一旦和某个值关联,后期不允许更改其指针指向(也就是不能重新赋值为其他的值)

const a; // Uncaught SyntaxError: Missing initializer in const declaration

const a = 12;
a = 13; // Uncaught TypeError: Assignment to constant variable

const obj = { name: 'zhufeng'};
obj.name = '珠峰';
console.log(obj); // {name: '珠峰'}