web重新学习第一期

164 阅读2分钟

深拷贝

  • 第一种是用JSON方法来转换,但是遇到对象中有functionundefined则会在转换过程中被忽略
  • 第二种方法是利用构造函数来实现深拷贝

工厂函数和构造函数相比的劣势

  • 工厂函数没有原型对象的公共空间,相比构造函数更加消耗内存
  • 由于工厂函数没有原型对象,所以不能用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,从而处理超大整型。