一、不存在变量提升
let不像var那样会发生‘变量提升’现象,所以,变量一定要在声明之后使用,否则报错 console.log(a); //输出undefined console.log(b); //报错ReferenceError var a = 1; let b = 1;
二、会产生暂时性死区
只有块级作用域内存在let命令,它所声明的变量就‘绑定’这个区域,不再受外部的影响 var tmp =123; if(true) { tmp = 'abc'; //ReferenceError let tmp; } 这段代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量之前对tmp赋值会报错 ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域,凡是在声明前就使用这些变量就会报错 综上可得,在代码块内,使用let命令声明变量之前,该变量都是不可用的,这在语法上,成为‘暂时性死区’
三、不允许重复声明
1、let不允许在相同作用域内,重复声明同一个变量
四、块级作用域存在的价值
ES5只有全局作用域和函数作用域,没有块级作用域,会出现以下问题:
1、内层变量可能会覆盖外层变量
var tmp = new Date(); funnction f() { console.log(tmp); if(false){ var tmp = 'Hello world'; } } f(); // undefined 这段代码输出结果为undefined, 原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量
2、 用来计数的循环变量泄露为全局变量
五、 字符串扩展
JavaScript只有indexOf方法
ES6又提供了三种方法
1. includes(); 返回布尔值,表示是否找到了参数字符串
2. startsWith(); 返回布尔值,表示参数字符串是否在源字符串的头部
3. endsWith(); 返回布尔值,表示参数字符串是否在源字符串的尾部
其中这三个方法都支持第二个参数,表示开始搜索的位置
使用第二个参数n时,endWith的行为与其他两个方法有所不同,它针对前n个字符,而其他两个方法针对从第n个位置直到字符串结束。
4、repeat()
repeat方法返回一个新字符串,表示将原字符串重复n次
5、padStart(), padEnd()
ES7推出字符串补全长度的功能,如果某个字符串不够指定长度,会在头部或者尾部补全。
padStart用于头部补全,padEnd用于尾部补全
'ycc'.padStart(5,'LL') //'LLycc' 'ycc'.padEnd(5,'LL') //yccLL 其中第一个参数指定字符串的最小长度,第二个参数用来补全的字符串 1、如果原字符的长度等于或大于指定的最小长度,则返回原字符 2、如果用来补全的字符串与源字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。 3、如果省略第二个参数,则会用空格补全长度
六、模板字符串(反引号)