被遗漏的const、let要点

2.1 let 命令

2.1.1 基本用法

let 块级作用域

for (let i = 0; i < 3; i++) {
  let i = "abc";
  console.log(i);
}
// 打印三次abc,说明for循环变量是父作用域,循环体是单独作用域

2.1.2 不存在变量提升

先定义变量后使用

2.1.3 暂时性死区(划重点)

只要块级作用域中存在let命令,所声明的变量就绑定(binding)在区域中,不能受到外部影响

var temp = 123;
if (true) {
  temp = 122; //temp not defined
  let temp;
}

var x = x;
let y = y; //y未定义

2.1.4不允许重复声明

let 不允许在相同作用域重复生命同一个变量

2.2 块级作用域与函数声明

块级作用域允许声明函数的规则只能在大括号中成立

"use strict";
if (true) {
  function f() {}
}

if (true) 
  function f() {} //报错

2.2 const 命令

2.3.1 基本用法

const 声明一个只读的常量,一旦声明,常量值不能改变(!!!真的不能改变么,答案在本质上

const PI = 3.14
console.log(PI)

PI = 3 //TypeError: Assignment to constant variable.

一样是块级作用域,存在暂时性死区,不能重复声明。

2.3.2本质(划重点)

const 实际上保证是不是变量值不得变动而是变量指向的地址不得变动。
对于基本数据类型,值保存在变量指向的内存地址中,因此等同于常量。但是对于引用性数据(以对象和数组为主),变量保存内存地址保存的只是指针,const只能保证指针是固定的,对于指针指向的数据不能保证。

"use strict";
const obj = {};
obj.value = 123;
console.log(obj.value); //123
foo = {}; //将foo指向另一个对象,正常模式下不报错,在严格模式下报错

文章为阮大大《ES6标准入门》整理而来

你可能感兴趣的:(被遗漏的const、let要点)