let 和const命令:
let
声明的变量只在它所在的代码块有效。
for
循环有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
不存在变量提升
在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”
let
不允许在相同作用域内,重复声明同一个变量。
块级作用域 ES6 的块级作用域必须有大括号
const 必须声明时赋值,且值以后不能改变,不能重复声明
const
命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
变量的解构赋值:
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
如果解构不成功,变量的值就等于undefined
。
解构赋值允许指定默认值。ES6 内部使用严格相等运算符(===
),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined
,默认值才会生效;;;;如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3
字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
字符串新增:
传统上,JavaScript 只有indexOf
方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6 又提供了三种新方法。
- includes():返回布尔值,表示是否找到了参数字符串。
- startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
- endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
- 这三个方法都支持第二个参数,表示开始搜索的位置。
repeat
方法返回一个新字符串,表示将原字符串重复n
次。- ES2017 引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。
padStart()
用于头部补全,padEnd()
用于尾部补全。 - ES2019 对字符串实例新增了
trimStart()
和trimEnd()
这两个方法。它们的行为与trim()
一致,trimStart()
消除字符串头部的空格,trimEnd()
消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。 at()
方法接受一个整数作为参数,返回参数指定位置的字符,支持负索引(即倒数的位置)。
module:
模块功能主要由两个命令构成:export
和import
。export
命令用于规定模块的对外接口,import
命令用于输入其他模块提供的功能。
defer
与async
的区别是:defer
要等到整个页面在内存中正常渲染结束(DOM 结构完全生成,以及其他脚本执行完成),才会执行;async
一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再继续渲染。一句话,defer
是“渲染完再执行”,async
是“下载完就执行”。另外,如果有多个defer
脚本,会按照它们在页面出现的顺序加载,而多个async
脚本是不能保证加载顺序的。
<script src="path/to/myModule.js" defer></script>
<script src="path/to/myModule.js" async></script>
浏览器加载 ES6 模块,也使用<script>
标签,但是要加入type="module"
属性。
do表达式:
本质上,块级作用域是一个语句,将多个操作封装在一起,没有返回值。
为了使得块级作用域可以变为表达式,也就是说可以返回值,办法就是在块级作用域之前加上do
,使它变为do
表达式,然后就会返回内部最后执行的表达式的值。