在函数作用域或全局作用域中,通过 var 关键字声明的变量,无论在哪里声明,都会被提升为当前作用域顶部声明的变量(即变量提升机制),但初始化操作会留在原处执行,如:
经过变量提升之后相当于
块级声明: 用于在指定块的作用域之外无法访问的变量。块级作用域(词法作用域)存在于:函数内部、块中(花括号{}包裹的区域)
ES6中新增的两个块级声明关键字 let 、const
let、const的相同点:声明的都是块级标识符,不存在声明提前
因此假如使用let、const声明的变量或常量没有立即赋值,从块作用域开始到该变量被初始化处理的阶段就称之为暂存死区(TDZ)
let: let的声明的用法与var相同。只不过let声明不会被提升(let声明的变量不存在变量提升机制)
若 let 声明的变量需要在当前封闭代码块的作用域全局使用,则可以将该变量放在当前代码块顶部声明
const :作用域和 let 关键字相同,只在声明所在的块级作用域内有效
定义(声明)常量(不能被修改的),声明的同时必须赋值,先声明后赋值会报错
且const声明的常量不能被重新声明或赋值
在同一作用域中,const声明的标识符必须是唯一的,存在同名标识符就会报错,无论其同名标识符是用什么关键字声明的
当前作用域下 temp 不能存在同名标识符,不能被重新声明或赋值
const temp = 233;
用const声明对象是一个比较特殊的存在,
const声明的对象不允许重新声明、修改绑定,但允许修改对象属性值
数组,不允许修改绑定,但允许修改值
const arr = ['chen','shi','jia','zu'];
arr[0] = 'huang';
console.log(arr); 不会报错
const arr = [1,3,4]; 报错
遍历数组arr,只执行i=0的一次循环,后续i=1,是为 i 重新赋值,报错
for (const i = 0; i < arr.length; i++) {
console.log(i);
}
数组可以被扩展,也可以被禁止
const arr = ['chen','shi','jia','zu'];
arr.push('qiye'); 不会报错
使用Object.freeze()函数可以禁止数组被扩展
const array = Object.freeze(arr);
array.push('qiye'); 报错
对象, 不允许修改绑定,但允许修改属性值
const obj = {
user:'chen',
hostname:'ID',
password:'123'
};
obj.user = 'huang';
console.log(obj); 不会报错
const obj = {name: 'huahua'}; 报错
遍历对象,不会报错
for (var key in obj) {
console.log(key);
}