let 关键字
不允许重复声明
在同一作用域内,使用 let
声明的变量不能被重复声明。如果尝试重新声明同名变量,会导致语法错误。
使用 var
关键字声明变量时,可以重复声明变量,而不会报错。
替换为 let
,则会报错。
块级作用域
使用let
声明的变量具有块级作用域,仅在声明的块内部有效。
不会变量提升
使用 let
声明的变量不会像 var
那样发生变量提升。
const 关键字
const
具有与 let
相似的作用域和块级作用域特性。
使用 const
声明的变量为常量。不能重新赋值。
使用 const
声明的变量在声明时必须进行初始化。
通常使用大写字母表示不可变的值(常量),而使用小写字母或驼峰命名法表示可变的值(变量)
更改 const 声明的数组
使用 const
声明的对象和数组。虽然本身不能重新赋值,但是可以修改对象和数组的属性或元素
JavaScript 提供了一个
Object.freeze
函数来防止数据改变。冻结对象后,便无法再从中添加,更新或删除属性。更改对象的任何尝试都会被拒绝,不会报错。
箭头函数
概念
在 JavaScript 中,在将一个函数作为参数传递给另一个函数时。
通常不需要命名这些函数,因为不会在其他地方重用它们。
ES6 提供了箭头函数语法糖:
特殊情况
当没有函数体,只有一个返回值时,箭头函数语法使您可以省略关键字 return
以及代码周围的括号:
const myFunc = () => 'value';
就像常规函数一样,您可以将参数传递给箭头函数
const doubler = (item) => item * 2;
如果箭头函数具有单个参数,则可以省略包围该参数的括号:
const doubler = item => item * 2
可以将多个参数传递给箭头函数:
const multiplier = (item, multi) => item * multi;
默认参数
ES6 引入了函数的默认参数,使我们能够在函数定义时为参数提供默认值。
如果没有传递该参数或传递的值为 undefined
,则会启动默认参数。
传递
null
还是会使用null
, 而不是使用默认参数。
模板字符串
ES6 引入了模板字符串,可以通过 ${}
嵌入表达式和变量,并支持多行字符串。
解构赋值
可以通过模式匹配的方式从数组或对象中提取值,赋值给变量。
解构对象
基础语法
解构时分配变量名
解构嵌套对象
初始对象:
解构对象
分配变量名
解构数组
基础语法
特殊情况
使用逗号到达所需索引来解构数组中任何索引的值:
其余元素
将解构后的其余元素分配给一个数组。
函数参数解构
Spread 运算符
ES6 引入了 Spread 运算符,它可以在需要多个参数或元素的地方将数组、对象或表达式展开。
展开数组
展开对象
传递函数参数
rest 参数
ES6 引入了 rest 参数作为函数参数。
使用 rest 参数,可以创建带有可变数量参数的函数。
这些参数存储在一个数组中,可以从函数内部进行访问。
使用 rest 参数可以让函数处理不定数量的参数,而不需要显式地定义每个参数。
类
ES6 提供了使用 class
关键字创建对象的语法。
定义类
使用 class
关键字来定义一个类,后面紧跟类名,通常首字母大写。
构造函数
类可以包含一个特殊的方法,称为构造函数,用于创建类的实例。
类方法
类可以定义自己的方法,这些方法将成为类的实例的方法。
实例化类
使用 new
关键字和类名来实例化一个类,并创建类的实例。
类属性
类可以定义静态属性和实例属性。
静态属性是属于类本身的属性,可以通过类名直接访问。
实例属性是每个类实例都拥有的属性,需要在构造函数或其他方法中定义。
定义子类
使用 extends
关键字来创建一个子类,后面跟着父类的类名。
super
在子类的构造函数中,使用 super
关键字调用父类的构造函数,并传递必要的参数。
方法重写
子类可以重写继承自父类的方法,以改变其行为或添加新的功能。
访问父类方法
在子类中,可以使用 super
关键字访问父类的方法。
静态方法继承
子类可以继承父类的静态方法。
简化的对象字面量语法
ES6 引入了一种简化的对象字面量语法,使得创建对象更加简洁和直观。
简化的 getter 和 setter
getter 和 setter 在 ES5 中被引入并得到支持,ES6 做了简化和改进,可以直接在对象字面量中定义。
迭代器和生成器
ES6 引入了迭代器 Iterator 和生成器 Generator 。
迭代器
迭代器是一个对象,它提供了一种统一的方式来遍历集合中的元素。它包含一个 next()
方法,每次调用该方法都会返回一个包含 value 和 done 属性的对象。value
表示当前迭代的值,done 表示迭代是否已完成。
生成器
生成器是一个函数,它可以通过使用 function*
语法定义,并使用 yield
关键字暂停和恢复函数的执行。生成器函数可以返回一个迭代器对象,通过调用迭代器对象的
next()
方法来遍历生成的值。
生成器函数可以使用
yield
暂停函数的执行,并将值返回给调用方。当再次调用next()
方法时,函数将从上次暂停的位置恢复执行,并继续生成下一个值。
Promise
ES6 引入了 Promise ,用于处理 JavaScript 中的异步操作。
Promise 构造函数接受一个执行器函数作为参数,该函数包含两个参数:resolve 和 reject。在执行器函数内部可以执行异步操作,并使用 resolve 函数来标志操作成功完成,并返回结果值;或使用 reject 函数来标志操作失败,并返回一个错误原因。
它有三种状态:
- 进行中(Pending)
- 已完成(Fulfilled)
- 已拒绝(Rejected)
.then()
方法接收一个回调函数作为参数,该回调函数在 Promise
对象的状态变为成功时被调用,并接收 Promise 解决(resolve)的值作为参数。
.catch()
方法接收一个回调函数作为参数,该回调函数在 Promise
对象的状态变为失败时被调用,并接收 Promise 拒绝(reject)的原因作为参数。
.then()
方法和 .catch()
方法都返回一个新的 Promise 对象,可以进行链式调用。
模块
ES6 引入了一种在 JavaScript 文件之间轻松共享代码的方法。
这涉及导出文件的一部分以供一个或多个其他文件使用,并在需要的地方导入所需的部分。
为了利用此功能,您需要在 HTML 文档中使用一种模块类型创建脚本。
export
import
导入所有内容
默认导出
导入默认导出
新增的数据结构
Set
Set 是一种无序且不重复的集合。
它的主要特点是:
- 不允许重复的值
- 无序性,即元素的顺序不是固定的
WeakSet
它是一种特殊的 Set,只能存储对象的弱引用(weak reference)。
Map
Map 是一种键值对的集合,其中每个键只能出现一次。
它的主要特点是:
- 键值对之间的映射关系
- 键可以是任意类型的值
WeakMap
它是一种特殊的 Map,其中键只能是对象,并且对于键引用的对象是弱引用(weak reference),不会阻止垃圾回收器回收它们。