Typescript Object.assign() VS 创建新对象效率

Typescript Object.assign() VS create new object Efficiency

我有两种方法来实现一个带有常量的方法,但我不确定哪种方法更好。有人可以咨询吗?谢谢!

方法 1:将常量从 class 中取出,这只会调用常量一次,但我需要 return 一个新变量

const X = {a: 0, b: 1, c: 2}
export class A{
   private method a (val: any) { 
       return {...X, ...val}
}}

方法二:在方法中放一个常量,每次调用方法(我是两次)都会调用这个常量,而不需要创建一个新的对象。

export class A{
   private method a (val: any) { 
       const x = {a: 0, b: 1, c: 2}
       return Object.assign(x, val)
}}

我认为这里没有灵丹妙药,每个情况可能不同,但我的建议是更多地关注变量的范围,而不是它被调用了多少次或创建了多少次对象。在第一种方法中,你在 class A 的范围之外声明了一个常量,所以基本上,任何 class 或同一范围内的函数都可以访问这个变量,在你的情况下它并没有那么糟糕,因为它是一个常量,但假设你已经用 let 声明了一个变量,在这种情况下你的问题开始出现,原因是任何 class 或函数可以重新分配这个变量任何值,从而导致副作用和你的代码中的错误,一个愚蠢的例子会澄清事情:

let x = 5

function isEven(value: number) {
    // here i'm overwriting the value of x
    x = 2

    return value % 2 === 0;
}

function destroyTheWorldIfEven(value: number) {
  if(isEven(value)){
      console.log("x is", x)
      console.log("you world has been destroyed")
      return
  }
  
  return console.log("you are safe")
}

// at the first call x is 5
destroyTheWorldIfEven(x)

// but at the second call x is 2 due the reassign in isEven function
destroyTheWorldIfEven(x)

因此,如果您不需要在函数或 class 之间共享 const X,我认为没有任何理由将其保留在 class 的范围之外A,我的建议是把东西放回原处,那么:

  1. 如果const x只用在classA的一个方法中,保持在方法内。
  2. 如果 const x 被 class A 中的一种或多种方法使用,请将其保留为私有属性。
  3. 如果const x属于classA但必须被其他classes访问,保留为public属性但避免定义[=54] =] 方法。

我会为你留下一些好的参考:

Javascript scope

Javascript hoisting

Javascript closure

SOLID principles

最后这一篇是我认为最重要的一篇,主要是当你在使用OOP的时候,一定要读一读。