JavaScript ES6语法
ES6新增语法
let
let语法
let声明的变量只在所处于的块级有效
let经典面试题
//题1
var arr = [];
for (var i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
//因为执行arr[0]这个函数时,i==2 i是全局变量了
arr[0](); //输出2
arr[1](); //输出2
//题2
let arr = [];
for (let i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0](); //输出0
arr[1](); //输出1
//因为let声明i,每次循环都会新增一块 块级作用域,i指向是当前块级作用域,所以输出的是自己上一级(循环产生的块级作用域)作用域下的i值
小结
- let用来声明变量
- let关键字声明的变量具有块级作用域
- 在大括号中,用let声明的变量具有块级作用域,而var是没有的
- 防止循环变量变成全局变量
- let声明的变量没有变量提升
- let声明的变量存在暂时性死区
//存在暂时性死区
var str = '111';
if(true){
str = 'aaa'; //虽然str是全局变量,但是if块级作用域中,let声明str,即使赋值操作在let声明变量前,也无法赋值成功
let str = 'a1';
}
const
const声明常量,常量就是值(内存地址)不能改变的量
//1.具有块级作用域
if(true){
const a = 1;
}
console.log(a); //报错
//2.声明常量必须赋值
const a = 1; //正常
const b; //报错
//3.声明常量的值不能被更改
const c = 'ccc';
c = 'ddd'; //报错Assignment to constant variable
//3.1 声明的数组可以修改数组中的值
const arr = ['a1','a2'];
arr[0] = '修改了';
console.log(arr); //输出['修改了','a2'];
//但是这种情况是不允许的
arr = ['第二次修改了','a2']; //报错Assignment to constant variable
//因为第二次修改属于重新赋值,会改变内存地址,是不给允许的
//但是第一次修改,只是修改内存地址指向的
var、let、const区别
- 使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象
- 使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升
- 使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值
解构赋值
//解构赋值 数组
var [a,b,c] = [1,2,3];
console.log(a); //输出1
console.