深拷贝
- 第一种是用JSON方法来转换,但是遇到对象中有function和undefined则会在转换过程中被忽略
- 第二种方法是利用构造函数来实现深拷贝
工厂函数和构造函数相比的劣势
- 工厂函数没有原型对象的公共空间,相比构造函数更加消耗内存
- 由于工厂函数没有原型对象,所以不能用construct来判断类型
#new所执行的操作
- 在内存中创建一个新对象
- 这个新对象内部的[[Prototype]]特性被赋值为构造函数的prototype属性
- 构造函数内部的this被赋值为这个新对象(即this指向新对象)
- 执行构造函数内部的代码(给新对象添加属性)
- 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
ES2020新特性
- ?? 空值合并运算符 当左侧操作数为null或者undefined时,其返回右侧的操作数。否则返回左侧的操作数。 与逻辑或 || 不同,逻辑或会在左侧操作数为false时返回右侧操作数,如果遇到 '' 或者 0时,会返回右侧操作数,而这并不是我们想要的结果。
const foo = null ?? 'default string';
console.log(foo); // default string
const baz = 0 ?? 1;
console.log(baz); // 0
- ?. 可选链式操作符
如果值的路径没有定义,那么可以在.之前加一个?,使得路径可选
let person = {};
console.log(person.profile); //undefined
console.log(person.profile.name ?? "any"); //TypeError: Cannot read property 'name' of undefined
console.log(person?.profile?.name ?? "any"); //any
- #类的私有变量 当某些属性不想被外部访问,只能在内部被访问时,可以用私有变量。
class Message{
#message = "width"
greet() {console.log(this.#message);}
}
const greeting = new Message()
greeting.greet() //width
console.log(greeting.#message); //SyntaxError: Private field '#message' must be declared in an enclosing class
- Promise.allSettled Promise.allSettled可以将全部的Promise的执行结果组成的数组返回。
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));
// [
// { status: 'fulfilled', value: undefined },
// { status: 'rejected', reason: undefined }
// ]
- BigInt JS中Number类型只能处理 -(2*53-1) 与 2*53-1范围内的值,超出这个范围内的值会出现异常。 在整数后面加 n 可以表示BigInt,从而处理超大整型。