一、不存在变量提升
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()
5、padStart(), padEnd()
ES7推出字符串补全长度的功能,如果某个字符串不够指定长度,会在头部或者尾部补全。
padStart用于头部补全,padEnd用于尾部补全
'ycc'.padStart(5,'LL') //'LLycc'
'ycc'.padEnd(5,'LL') //ycclL
其中第一个参数指定字符串的最小长度,第二个参数用来补全的字符串
1、如果原字符的长度等于或大于指定的最小长度,则返回原字符
2、如果用来补全的字符串与源字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。
3、如果省略第二个参数,则会用空格补全长度
六、模板字符串(反引号)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。