笔记 ES6+基础

115 阅读11分钟

ES6

let 和 const

let
	块级作用域
	不会被预解析(变量提升)
	暂时性死区
	不能重复声明
const
	常量,同let

解构赋值

// 对象解构:变量名 和 属性名 要对应
let obj = {
  a: 1,
  b: 2,
  c: 3,
};
let { a: x, c } = obj; // 将a重命名为x
console.log(x, c); // 1, 3
// 数组解构:变量名 和 值索引对应
let arr = [1, 2];
[b, a] = arr;
console.log(a, b); // 2, 1
// 字符串解构同数组
let str = "ABCD";
let [a, b] = str;
console.log(a, b); // A, B

扩展运算符

// 对象
// 展开运算符
let obj = {
  a: 1,
  b: 2,
};
let obj2 = {
  ...obj,
  c: 3,
  d: 4,
};
console.log(obj2);
/*
    {
        "a": 1,
        "b": 2,
        "c": 3,
        "d": 4
    }
*/
// 剩余参数
let { a, ...d } = obj2;
console.log(a, d);
/*
    1,
    {
        "b": 2,
        "c": 3,
        "d": 4
    }
*/
// 数组
// 展开运算符
let arr = [1, 2, 3];
let arr2 = ["a", ...arr, "b"];
console.log(arr2); // ["a", 1, 2, 3, "b"]
// 剩余参数
let arr3 = [1, 2, 3, 4, 5];
let [a, ...b] = arr3;
console.log(a, b); // 1, [2, 3, 4, 5]

Set 和 Map

Set

基础属性
Set.prototype.size属性 数据长度
Set.prototype.add() 添加子项  返回 set 数据本身
Set.prototype.has() 是否包含子项
Set.prototype.delete() 删除子项 返回 true | false
Set.prototype.clear(): 清空Set实例 返回 undefined
可迭代: (键名=键值)
Set.prototype.keys():返回键名;
Set.prototype.values(): 返回键值;
Set.prototype.entries(): 返回键值对;
可以包含任何 JavaScript 数据类型作为值

注:不会添加重复的值 返回类数组用[...set]或 Array.from(set)转为数组

let data = [...new Set([1, 2, 3, 1, 2])];
console.log(data); // [1, 2, 3]

扩展 WeakSet

成员都是对象 (WeakSet中的值只能是Object)
成员都是弱引用,可以被垃圾回收机制回收,可以用来保存DOM节点,不容易造成内存泄漏
不支持迭代

Map

基础属性
Map.prototype.size属性 数据长度
Map.prototype.set() 设置子项  返回 Map 数据本身
Map.prototype.get() 不存在为undefined
Map.prototype.has() 是否包含子项
Map.prototype.delete() 删除子项 返回 true | false
Map.prototype.clear(): 清空Set实例 返回 undefined
可迭代:
Map.prototype.keys():返回键名;
Map.prototype.values(): 返回键值;
Map.prototype.entries(): 返回键值对;

使用 new 关键字和 Map 构造函数可以创建一个空映射 作用 快速找到 key 对应的 value,比对象性能好

const map = new Map([
  ["a", 1],
  ["b", 2],
  ["c", 3],
]);

扩展 WeakMap

只接受对象作为键名 (WeakMap中的键只能是Object,只要有一个键无效就会抛出错误)
键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
不支持迭代
const weakMap = new WeakMap([
  [key1, 1],
  [key2, 2],
]);

箭头函数

1. 没有自己的 this,通常指向外部的对象的 this2. 不可以当作构造函数,即不能使用 new 命令;
3. 没有 arguments 对象,可以用 rest 代替;
4. 不可以使用 yield 命令,不能作为 Generator 函数。

对象方法

Object.assign(target, ...sources);

将所有可枚举属性的值从一个或多个源对象复制到目标对象
参数:
    target 目标对象
    sources 源对象
返回值:
    合并后的目标对象

Object.is(value1, value2);

判断两个值是否是相同的值。
规则:
    两个值都是 undefined
    两个值都是 null
    两个值都是 true 或者都是 false
    两个值是由相同个数的字符按照相同的顺序组成的字符串
    两个值指向同一个对象
    两个值都是数字并且
    都是正零 +0
    都是负零 -0
    都是 NaN
返回值:
    true || false

数组方法

Array.from(arrayLike[, mapFn[, thisArg]])

将类数组转换成数组
参数:
    arrayLike 类数组
    mapFn 类似 map 方法,循环类数组时的回函函数,返回值组成新数组
    thisArg mapFn 函数执行时的 this 指向
返回值
    根据 arrayLike 生成的新数组

Array.isArray(data)

检测数据是否是个数组
参数:
    data 要检测的数据
返回值:
    true 数组,false 非数组

Array.of(element0[, element1[, ...[, elementN]]])

将参数转成一个数组
参数:
    elementN 要放入数组中的数据
返回值:
    新数组

Array.prototype.fill(value[, start[, end]]);

用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引
参数:
    用来填充数组元素的值。
    可选参数:
        start
            起始索引,默认值为 0end
            终止索引,默认值为 arr.length

Array.prototype.find(callback[, thisArg])

查找数组中满足要求的第一个元素的值
参数:
    callback
        element 当前遍历到的元素
        index[可选] 当前遍历到的索引
        array[可选] 数组本身
    thisArg 执行回调时用作 this 的对象
返回值
    数组中第一个满足所提供测试函数的元素的值,否则返回 undefined

下文的 callback, thisArg 和当前一致 不再赘述

Array.prototype.findIndex(callback[, thisArg])

查找数组中满足要求的第一个元素的值的索引
返回值:
    满足要求的值的索引

字符串方法

String.prototype.includes(valueToFind[, fromIndex])

判断字符串是否包含一个指定的值
详细: 参考数组的 includes

String.prototype.startsWith(searchString[, position])

判断当前字符串是否以另外一个给定的子字符串开头
参数
    searchString 要搜索的子字符串。
    position
        在 str 中搜索 searchString 的开始位置,默认值为 0,也就是真正的字符串开头处。
返回值
    如果传入的子字符串在搜索字符串的开始则返回 true;否则将返回 false

String.prototype.endsWith(searchString[, length])

判断当前字符串是否是以另外一个给定的子字符串“结尾”
参数
    searchString 要搜索的子字符串。
    length 作为 str 的长度。默认值为 str.length
返回值
    如果传入的子字符串在搜索字符串的末尾则返回 true;否则将返回 false

String.prototype.repeat(count)

构造并返回一个新字符串,该字符串包含被连接在一起的指定数量的字符串的副本
参数
    count 介于 0 和正无穷大之间的整数。表示在新构造的字符串中重复了多少遍原字符串
返回值
    生成的新字符串

模板字符串

允许嵌入表达式的字符串字面量
${}中放差值表达式
`string text ${expression} string text`;

函数的默认值

function fn(a = 10) {
  return a + 1;
}
fn(); // 11

Symbol

ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。
只要属性名是 Symbol 类型,可以保证不会与其他属性名产生冲突。

对象的简洁表示

let a = 0;
let b = 1;
let obj = {
  a, // a: a
  c() {
    console.log(123);
  },
};

属性名表达式

let n = "name";
let obj = {
  [n]: "leo",
};
// 作为属性名
let mySymbol = Symbol();
// 第一种写法
let a = {};
a[mySymbol] = "Hello!";
// 第二种写法
let a = {
  [mySymbol]: "Hello!",
};
a[mySymbol]; // "Hello!"

Class

构造函数的语法糖

ES7

数组方法

Array.prototype.includes(valueToFind[, fromIndex])

判断数组中是否包含一个指定的值
参数:
    valueToFind 需要查找的值
    fromIndex 处开始向后查找

返回值:
    true 代表数组中包含 valueToFind, false 代表数组中不包含 fromIndex

指数运算符

在 ES7 之前,计算数字的指数需要通过 Math.pow 方法来完成,在 ES7 中,增加了**运算符,可以来计算指数。

const res1 = Math.pow(2, 4);
const res2 = 2 ** 4;
// res1 == res2

ES8

对象方法

Object.values(target)

获取目标对象的所有value值。
参数:
    target 对象
返回值:
    所有value的数组

Object.entries(target)

获取到一个二维数组,数组中会存放可枚举的键值对数组,数组元素分别为对象的key和value。
参数:
    target 对象
返回值:
    二维数组 每一项是[key,value]

传入一个数组,下标作为第一个元素
传入一个字符串,下标作为第一个元素

Object.getOwnPropertyDescriptors(target)

获取一个对象的所有自身属性的描述符
参数:
    target 目标对象
返回值:
    对象的所有自身属性的描述符

字符串方法

String.prototype.padStart(strLength,padString)

对字符串进行前填充

String.prototype.padEnd(strLength,padString)

对字符串进行前填充
参数:
    strLength 字符串填充后的长度
    padStaring 填充的内容
返回值:
    填充后的字符串

函数参数列表结尾允许逗号

SharedArrayBuffer 对象

对象用来表示一个通用的、固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer 对象,它们都可以用来在共享内存(shared memory)上创建视图。
与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被转移。

Atomics 对象

Atomics 对象提供了一组静态方法对 SharedArrayBufferArrayBuffer 对象进行原子操作。

ES9

Rest/Spread 属性

Rest 参数语法允许我们将一个不定数量的参数表示为一个数组

正则新特性

dotAll

匹配除回车外的任何单字符,标记 s 改变这种行为,允许行终止符的出现

命名捕获组

允许命名捕获组使用符号?`<name>`,既便于阅读代码,又便于引用
// 日期转为美国的MM-DD-YYYY
const reDate = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/,
  d = "2018-04-30",
  usDate = d.replace(reDate, "$<month>-$<day>-$<year>");

ES10

数组方法

Array.prototype.flat([depth])

扁平化多维数组
参数:
    depth 指定要提取嵌套数组的结构深度,默认值为 1。
返回值:
    一个包含将数组与子数组中所有元素的新数组

Array.prototype.flatMap(callback[, thisArg])

它与 map 和 深度值 1 的 flat 几乎相同,但 flatMap 通常在合并成一种方法的效率稍微高一些
返回值:
    一个包含将数组与子数组中所有元素的新数组

字符串方法

String.prototype.trimStart()

trimStart() 方法从字符串的开头删除空格。trimLeft() 是此方法的别名。

String.prototype.trimEnd()

trimEnd() 方法从一个字符串的末端移除空白字符。trimRight() 是这个方法的别名。

String.prototype.matchAll(regexp)

参数:
    regexp 匹配的正则表达式。
    如果所传参数不是一个正则表达式对象,则会隐式地使用 new RegExp(obj) 将其转换为一个 RegExp 。
返回值:
    一个包含所有匹配正则表达式的结果及分组捕获组的迭代器。

对象方法

Object.fromEntries(iterable)

把键值对列表转换为一个对象。(Map对象转对象)
参数:
   iterable 类似ArrayMap或者其它实现了可迭代协议的可迭代对象。
返回值:
    一个由该迭代对象条目提供对应属性的新对象。

Symbol.prototype.description

创建时 Symbol([description])
返回创建对象时的description  它会返回 Symbol 对象的可选描述的字符串。

可选 Catch

try {
} catch (err) {}

// 这里的err是必须的参数,在ES10可以省略这个参数:
try {
} catch {}

ES11

空值合并

逻辑操作符?? 当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数
    let foo = {
        a: false,
        b: null,
        c: undefined
        d: '',
    }
    let a = foo.a ?? 'demo1'  // false
    let b = foo.b ?? 'demo2'  // demo2
    let c = foo.c ?? 'demo3'  // demo3
    let d = foo.d ?? 'demo4'  // ''
    let e = foo.e ?? 'demo5'  // 'demo5'

可选链操作符

允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效
(null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined
let foo = {};
let a = foo.a.name; // TypeError: Cannot read properties of undefined (reading 'name')
let b = foo.b?.name; // undefined

// 和空值合并使用 设置默认值
let c = foo.c?.name ?? ""; // ""

import() 按需导入

btn.onclick = function () {
  import("./module.js").then((module) => {
    console.log(module);
  });
};

新基本数据类型 BigInt

BigInt 是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。
这原本是 Javascript 中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。
不同点:
    1. 不能用于 Math 对象中的方法;
    2. 不能和任何 Number 实例混合运算,两者必须转换成同一种类型,但可以相互比较。
    在两种类型来回转换时要小心,因为 BigInt 变量在转换成 Number 变量时可能会丢失精度。

globalThis

全局属性 globalThis 包含全局的 this 值,类似于全局对象(global object)
严格模式下获取全局 this

浏览器:window 对象
node:global 对象

ES12

字符串方法

String.prototype.replaceAll(regexp|substr, newSubstr|function)

返回一个新字符串,新字符串所有满足 pattern 的部分都已被replacement 替换。

备注:当使用一个 `regex`时,您必须设置全局(“ g”)标志,否则,它将引发 TypeError:“必须使用全局 RegExp 调用 replaceAll”。
参数:
    regexp|substr       必填。规定子字符串或要替换的模式的 RegExp 对象。 匹配的正则|被匹配的字符串
    newSubstr|function 	必填。一个字符串值。规定了替换文本或生成替换文本的函数。
返回值:
    填充后的字符串

WeakRefs

WeakRef对象允许您保留对另一个对象的弱引用,而不会阻止被弱引用对象被GC回收

逻辑运算符和赋值表达式

逻辑运算符和赋值表达式,新特性结合了逻辑运算符(&&,||,??)和赋值表达式而 JavaScript 已存在的 复合赋值运算符有:
a ||= b; // a = a || b; 等价于:a = a ? a : b
a &&= b; // a = a && b; 等价于:a = a ? b : a
a ??= b; // a = a ?? b; 等价于:a = (a === null || a === undefined) ? b : a

数字分隔符

允许数值字面量中间包含不连续的_,以提高可读性。当文件被解析时,这些下划线将被自动去除。
注:只能在数字之间,只允许一个下划线作为数字分隔符
例:1_000_000_000; // 十进制