ES2020新增方法
类的私有属性
通过在变量或函数前面添加一个简单的散列符号,我们可以将它们完全保留在类内部使用。
静态方法
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。
如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,
而是直接通过类来调用,这就称为“静态方法”。
静态属性
静态属性指的是 Class 本身的属性,即Class.propName,
而不是定义在实例对象(this)上的属性。
私有属性 私有方法
私有方法和私有属性,是只能在类的内部访问的方法和属性,外部不能访问。
class InnerStatic {
// 静态属性
static staticProps = 'string';
// 静态方法
static staticFun = ()=>{};
// 私有属性
#message = 1;
// 私有方法
#getMessage(){
console.log('#message values', this.#message);
}
实例方法
getMessage(){
}
}
let instance = new InnerStatic();
instance.getMessage();
console.log(instance.#message) // Private name #message is not defined
无效合并操作符
因为 JavaScript 是动态类型的,所以在分配变量时需要牢记 JavaScript 对真 / 假值的处理。 如果我们有一个具有一些值的对象,有时候我们希望允许一些技术上有误的值,比如一个空字符串或者数字0。 设置默认值很快会变得烦人,因为它会覆盖应该是有效值的内容。
let person = {
profile: {
name: '',
age: 0
}
};
console.log('无效合并操作符', person.profile.name || 'Anonymous'); // Anonymous
console.log('无效合并操作符', person.profile.name ?? 'Anonymous'); // ''
可选的链接操作符
在点符号之前添加一个问号,我们可以使值的路径的任何部分可选
let person = {};
// console.log(person.profile.name ?? ''); // Cannot read property 'name' of undefined
console.log(person?.profile?.name); // undefined
if (person?.profile?.name) {
console.log('have name props');
} else {
console.log('not exits name props');
}
可用于判断数据属性是否存在,不必写成冗长的
person && person.profile && person.profile.name的格式
BigInt
通过在末尾加上字母 n 解决js中数字超过最大数值精度错误问题
const max = Number.MAX_SAFE_INTEGER;
console.log(max); // 9007199254740991
console.log(max + 1);
console.log(max + 2);
console.log(max + 3);
const bigNum = 1000000000000000000000000000000000000000000000n;
console.log(bigNum + 1n); // 1000000000000000000000000000000000000000000001n
Dynamic Import 动态导入
如果您的文件中充满了实用函数,其中一些函数可能很少被使用,导入它们的所有依赖项可能只是浪费资源。 现在我们可以使用 async / await 在需要的时候动态导入依赖关系。
math.js
const add = (num1, num2) => num1 + num2;
export { add };
---------------------
index.js
const doMath = async (num1, num2) => {
if (num1 && num2) {
const math = await import('./math.js');
console.log(math.add(5, 10));
};
};
doMath(4, 2);
Promise.allSettled
接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果,不管是fulfilled还是rejected,包装实例才会结束。
const p1 = new Promise((res, rej) => setTimeout(res, 1000));
const p2 = new Promise((res, rej) => setTimeout(rej, 1000));
Promise.allSettled([p1, p2]).then(data => console.log(data));
// [
// Object { status: "fulfilled", value: undefined},
// Object { status: "rejected", reason: undefined}
// ]