被遗漏的const、let要点
2018-04-26 本文已影响0人
芒果加奶
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标准入门》整理而来