JavaScript|ES7~ES12常见基础用法

ES7~ES12是 ES6 的补充,里面有很多比较灵活的用法可以在日常中使用,如果对 ES6 不太熟悉的可以看看这里:JavaScript|ES6日常用法详解

ES7 - Array Includes

在ES7之前,如果我们想判断一个数组中是否包含某个元素,需要通过 indexOf 获取结果,并且判断是否为 -1。 在ES7中,我们可以通过includes来判断一个数组中是否包含一个指定的元素,根据情况,如果包含则返回 true, 否则返回false。
arr.includes(valueToFind[, fromIndex])
fromIndex(可选): 从fromIndex 索引处开始查找 valueToFind。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜 (即使从末尾开始往前跳 fromIndex 的绝对值个索引,然后往后搜寻)。默认为 0。

const arr = [1, 2, 3, 4, 5];
console.log(arr.includes(3)); // true
console.log(arr.includes(6)); // false
console.log(arr.includes(3, 3)); // false
console.log(arr.includes(3, -1)); // true

ES7 –指数(乘方) exponentiation运算符

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

console.log(2 ** 3); // 8
console.log(2 ** -3); // 0.125

ES8 Object values

之前我们可以通过 Object.keys 获取一个对象所有的key,在ES8中提供了 Object.values 来获取所有的value值:

const obj = {
  a: 1,
  b: 2,
  c: 3
};

console.log(Object.values(obj)); // [1, 2, 3]

ES8 Object Entries

通过Object.entries可以获取到一个数组,数组中会存放可枚举属性的键值对数组。

const obj = {
  a: 1,
  b: 2,
  c: 3
};

console.log(Object.entries(obj)); // [['a', 1], ['b', 2], ['c', 3]]

ES8 String PadStart和PadEnd

某些字符串我们需要对其进行前后的填充,来实现某种格式化效果,ES8中增加了 padStart 和 padEnd 方法,分别是对字符串的首尾进行填充的。

const str = 'hello';
console.log(str.padStart(10, 'hi')); // 'hihello'
console.log(str.padEnd(10, 'hi')); // 'hellohi'

// 小场景:对银行卡实现位数隐藏
const card = '1234 1234 1234 1234';
const lastFour = card.slice(-4);
const masked = lastFour.padStart(card.length, '*');

console.log(masked); // '************1234'

ES8 - Trailing Commas

在 ES8 中,我们可以通过在函数参数的最后一个元素后面添加逗号来让 JavaScript 忽略最后一个参数。

function log(a, b, c,) {
  console.log(a, b, c);
}

log(1, 2, 3); // 1 2 3
log(1, 2, 3, 4); // 1 2 3

ES10 - flat flatMap

flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。

flatMap() 方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。

注意一:flatMap是先进行map操作,再做flat的操作;
注意二:flatMap中的flat相当于深度为1;

const arr = [1, 2, 3, [4, 5], 6, [7, [8, 9]]];

console.log(arr.flat()); // [1, 2, 3, 4, 5, 6, 7, [8, 9]]
console.log(arr.flat(2)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

const arr2 = ['a b c', 'd e f', 'g h i'];
console.log(arr2.flatMap(x => x.split(' '))); // ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

ES10 - Object fromEntries

ES8提供了对象转换方法Object.fromEntries,可以将一个键值对数组转换为对象,如果有entries怎么转换成对象呢?

const entries = [['name', '张三'], ['age', 18]];
const obj = Object.fromEntries(entries);
console.log(obj); // {name: '张三', age: 18}

ES10 - trimStart trimEnd

去除一个字符串首尾的空格,我们可以通过trim方法,如果单独去除前面或者后面呢?
ES10中给我们提供了trimStart和trimEnd;

const str = '  hello  ';
console.log(str.trimStart()); // 'hello  '
console.log(str.trimEnd()); // '  hello'
console.log(str.trim()); // 'hello'

ES11 - BigInt

BigInt是一个新的数据类型,它可以表示一个大的整数,比如 JavaScript 中的整数只能表示到 2^53 之间,BigInt 可以表示到 2^1024 之间。BitInt的表示方法是在数值的后面加上n。

const int = 2 ** 53;
console.log(int) // 9007199254740992
console.log(int + 1); // 9007199254740992 无法直接加1,因为这个数超过了2的53次方

const bigInt = BigInt(9007199254740993);
console.log(bigInt); // 9007199254740993n

ES11 - Nullish Coalescing Operator

ES11,Nullish Coalescing Operator增加了空值合并操作符:

const a = undefined;

const r1 = a ?? 'default';
console.log(r1); // 'default'

const r2 = a || 'default';
console.log(r2); // 'default'

ES11 - Optional Chaining

ES11,Optional Chaining增加了对象属性的可选调用:

const obj = {
  a: {
    b: {
      c: 'hello'
    }
  }
};

if (obj.a && obj.a.b && obj.a.b.c) {
  console.log(obj.a.b.c); // 'hello'
}

console.log(obj?.a?.b?.c); // 'hello'
console.log(obj?.a?.b?.d); // undefined

ES11 - Global This

在之前我们希望获取JavaScript环境的全局对象,不同的环境获取的方式是不一样的:比如在浏览器中可以通过this、window来获取,在Node中我们需要通过global来获取……那么在ES11中对获取全局对象进行了统一的规范:globalThis:

console.log(global); // <ref *1> Object [global]  {...}
console.log(this); // Window {...}
console.log(globalThis); // Window {...}

ES12 - FinalizationRegistry

FinalizationRegistry是一个新的对象,用于管理对象的清理工作,它可以在可以让你在对象被垃圾回收时请求一个回调。
FinalizationRegistry 提供了这样的一种方法:当一个在注册表中注册的对象被回收时,请求在某个时间点上调用一个清理回调。(清理回调有时被称为 finalizer ); 你可以通过调用register方法,注册任何你想要清理回调的对象,传入该对象和所含的值;

const registry = new FinalizationRegistry(
  (target) => {
    console.log('对象被销毁', target); // <ref *2> Object {...}
  }
);

const obj = {name: '张三'};
registry.register(obj, 'hello');

obj = null;

ES12 - WeakRefs

WeakRefs是一个新的对象,用于管理对象的弱引用,如果我们默认将一个对象赋值给另外一个引用,那么这个引用是一个强引用:如果我们希望是一个弱引用的话,可以使用WeakRef;

const obj = {name: '张三'};

const weakRef = new WeakRef(obj);

weakRef.name = '李四';

console.log(obj.name); // 张三

ES12 - logical assignment operators

  1. ||= 逻辑或赋值运算
let message = "hello world"
message = message || "default value" // "hello world"
message ||= "default value" // "hello world"
  1. &&= 逻辑与赋值运算
let message = "hello world"
message = message && "default value" // "default value"
message &&= "default value" // "default value"

let info = { name: '张三' };
info &&= info.name; // "张三"
  1. ??= 逻辑或赋值运算
let message = "hello world"
message ??= "default value" // "hello world"
let blank = ''
blank ??= "default value" // "default value"