# 🚀ES8

📅 2023/7/10

# Async函数

async 函数是 AsyncFunction 构造函数的实例,并且其中允许使用 await 关键字。async 和 await 关键字让我们可以用一种更简洁的方式写出基于 Promise 的异步行为,而无需刻意地链式调用 promise。

async function fun1(){
    const a = await fun2()
}

# Object.values()

Object.values() 静态方法返回一个给定对象的自有可枚举字符串键属性值组成的数组。

const array = { 0: "a", 1: "b", 2: "c" }
console.log(Object.values(array)) // ['a', 'b', 'c']

使用数字键时,将按键的数字顺序返回值

const array = { 100: "a", 2: "b", 7: "c" }
console.log(Object.values(array)) // ['b', 'c', 'a']

# Object.entries()

Object.entries() 静态方法返回一个数组,包含给定对象自有的可枚举字符串键属性的键值对。

const obj = { 0: "a", 1: "b", 2: "c" };
console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] 

使用数字键时,将按键的数字顺序返回值

const obj = { 100: "a", 2: "b", 7: "c" };
console.log(Object.entries(obj)); // [ ['2', 'b'], ['7', 'c'], ['100', 'a'] ]

# String.prototype.padStart(),String.prototype.padEnd()

padStart() 方法用另一个字符串填充当前字符串(如果需要的话,会重复多次),以便产生的字符串达到给定的长度。从当前字符串的左侧开始填充。 padEnd() 方法会用一个字符串填充当前字符串(如果需要的话则重复填充),返回填充后达到指定长度的字符串。从当前字符串的末尾(右侧)开始填充。 padStart(targetLength,padString)

  • targetLength 当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
  • padString 可选 填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断。此参数的默认值为 " "(U+0020)。 padEnd()用法相似,只不过是在字符串末尾进行填充
'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "foo");  // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0");     // "00000abc"
'abc'.padStart(1);          // "abc"
//将数字转换为固定长度的字符串
function leftFillNum(num, targetLength) {
    return num.toString().padStart(targetLength, 0);
}

const num = 123;
console.log(leftFillNum(num, 5));// 预期输出:"00123"

# 尾后逗号

尾后逗号 (有时叫做“终止逗号”),JSON 不允许尾后逗号。 字面量中的尾后逗号

//数组:JavaScript 忽略数组中的尾后逗号
var arr = [1, 2, 3]
arr; // [1, 2, 3]
arr.length; // 3
//如果使用了多于一个尾后逗号,会产生省略(elision,或者间隙 hole)。带有间隙的数组叫做稀疏数。例如,当使用 Array.prototype.forEach() 或 Array.prototype.map() 迭代数组时,会跳过数组间隙。
var arr = [1, 2, 3,,,];
arr.length; // 5

//对象
const object = {
  foo: "bar",
  baz: "qwerty",
  age: 42,
};

函数中的尾后逗号
尾后逗号并不影响函数定义,或者其arguments对象的 length属性。尾后逗号也可用于类或对象的方法定义。下面函数定义都是合法的。

function f(p) {}
function f(p,) {}

(p) => {};
(p,) => {};

class C {
  one(a,) {},
  two(a, b,) {},
}

const obj = {
  one(a,) {},
  two(a, b,) {},
};

//调用时也可以使用
f(p);
f(p,);

Math.max(10, 20);
Math.max(10, 20,);  
//不合法的尾后逗:仅仅包含逗号的函数参数定义或者函数调用会抛出 SyntaxError。而且,当使用剩余参数的时候,并不支持尾后逗号。
function f(,) {} // SyntaxError: missing formal parameter
(,) => {};       // SyntaxError: expected expression, got ','
f(,)             // SyntaxError: expected expression, got ','

function f(...p,) {} // SyntaxError: parameter after rest parameter
(...p,) => {}        // SyntaxError: expected closing parenthesis, got ','

解构中的尾后逗号
在使用解构赋值时,尾后逗号也可以用于左侧

// 带有尾后逗号的数组解构
[a, b,] = [1, 2];

// 带有尾后逗号的对象解构
var o = {
  p: 42,
  q: true,
};
var {p, q,} = o;

//在使用剩余参数时,会抛出 SyntaxError:
var [a, ...b,] = [1, 2, 3];// SyntaxError: rest element may not have a trailing comma

JSON中的尾后逗号
对象中的尾后逗号仅仅在 ECMAScript 5 中引入。由于 JSON 基于 ES5 之前的语法, JSON 中并不允许尾后逗号。

# Object.getOwnPropertyDescriptors()

Object.getOwnPropertyDescriptors() 静态方法返回给定对象的所有自有属性描述符。
语法:
Object.getOwnPropertyDescriptors(obj)
obj:要获取其所有自有属性描述符的对象。
返回值:一个包含给定对象的所有自有属性描述符的对象。如果没有属性,则可能是一个空对象。

const object1 = {
  property1: 42
};

const descriptors1 = Object.getOwnPropertyDescriptors(object1);

console.log(descriptors1.property1.writable);//output: true

console.log(descriptors1.property1.value);//output: 42

# SharedArrayBuffer

新增SharedArrayBuffer 对象:用来表示一个通用的,固定长度的原始二进制数据缓冲区

/*
 * @param {*} length 所创建的数组缓冲区的大小,以字节(byte)为单位。
 * @returns {SharedArrayBuffer} 一个大小指定的新 SharedArrayBuffer 对象。其内容被初始化为 0。
 */
new SharedArrayBuffer(10)

# Atomics

提供了一组静态方法对 SharedArrayBuffer 和 ArrayBuffer 对象进行原子操作,Atomics 不是构造函数,因此不能使用 new 操作符调用,也不能将其当作函数直接调用。Atomics 的所有属性和方法都是静态的(与 Math 对象一样)。具体使用方法请参考MDN (opens new window)