在JavaScript中使用或不使用中间变量时,代码是否更优化

在JavaScript中使用或不使用中间变量时,代码是否更优化,javascript,optimization,Javascript,Optimization,哪种代码优化得更好?为什么?CodeBlock1更具可读性,但它使用两个不需要的变量。然而,CodeBlock2可读性较差,但看起来非常优化 function CodeBlock1(x,y,z,n,m,p) { var a= x || y || z; var b= n || m || p; var c = a || b; return c } //OR function CodeBlock2(x,y,z,n,m,p) { return x||y||z || n ||m||p; }

哪种代码优化得更好?为什么?CodeBlock1更具可读性,但它使用两个不需要的变量。然而,CodeBlock2可读性较差,但看起来非常优化

function CodeBlock1(x,y,z,n,m,p)
{
var a= x || y || z; 
var b= n || m || p; 
var c = a || b; 
return c 
}

//OR 

function CodeBlock2(x,y,z,n,m,p)
{
return x||y||z || n ||m||p;
}

基本上,你必须认为如果你有
a | | | b | | c | | | | |的X
(X次比较),在最坏的情况下,您需要检查X次,较少的是检查一次(a是真实的)

这是因为
|
如何工作,它将在第一个
TRUE
语句处停止

所以

因此基本上,
CodeBlock2
的最坏情况是
6次
,而
CodeBlock1
的最坏情况是8次。
此外,您正在
CodeBlock1
上定义更多变量,因此可能会增加更多负载。

为这两种方法生成字节码会产生以下结果:

代码块1 代码块2 第一个“更复杂”,因为堆上有中间存储,而不是像第二个那样只使用堆栈<代码>代码块1使用更多空间和更多指令

CodeBlock2
是否因此“更优化?”这取决于您希望优化的内容

  • CodeBlock1:使用调试工具更易于阅读和调试
  • 代码块2:占用更少的内存并执行更少的指令

使用
node--print bytecode index.js
,自己尝试一下,假设脚本的名称是
index.js

,只需直观地查看它们,第一个脚本将定义三个附加变量。除此之外,就性能而言,我怀疑是否存在明显的差异。事实并非如此。代码块1将做更多的工作。因为它将始终执行三个操作,以确定a、b和c的值。其中,由于第二个块最多可以执行1个操作,如果x为真,我认为CodeBlock1会使其看起来更复杂,最后如果只有1或参数为真,则返回值将为真,并且CodeBlock2的可读性更高,因为该逻辑也更优化。代码2中的空间复杂度更低,因为变量更少,但是这两种代码的时间复杂度是相同的,因为它们总是执行五次检查。代码1可以提供更高的可读性,当检查按3分组时,您可以通过案例(isSomething | | | isSomethingElse)进行区分。一般来说,我从不相信任何人对什么更优化的意见(尽管这个案例非常简单,我认为所有这些注释都是准确的),如果您对性能有疑问,请对其进行基准测试!
function CodeBlock1(x,y,z,n,m,p){
    var a= x || y || z;  //this will check 1, 2 o 3 times
    var b= n || m || p;  //this will check 1, 2 o 3 times
    var c = a || b; //this will check 1 or 2 times.

    //worse case you will check 3 + 3 + times.
    return c;
}


function CodeBlock2(x,y,z,n,m,p){
    // this will check 1, 2, 3, 4, 5 or 6 times
    return x || y|| z || n || m || p;
}
[generated bytecode for function: CodeBlock1]
Parameter count 7
Frame size 24
   81 E> 0x1e25e29944ba @    0 : a1                StackCheck
  106 S> 0x1e25e29944bb @    1 : 25 07             Ldar a0
         0x1e25e29944bd @    3 : 92 08             JumpIfToBooleanTrue [8] (0x1e25e29944c5 @ 11)
         0x1e25e29944bf @    5 : 25 06             Ldar a1
  111 E> 0x1e25e29944c1 @    7 : 92 04             JumpIfToBooleanTrue [4] (0x1e25e29944c5 @ 11)
         0x1e25e29944c3 @    9 : 25 05             Ldar a2
         0x1e25e29944c5 @   11 : 26 fb             Star r0
  128 S> 0x1e25e29944c7 @   13 : 25 04             Ldar a3
         0x1e25e29944c9 @   15 : 92 08             JumpIfToBooleanTrue [8] (0x1e25e29944d1 @ 23)
         0x1e25e29944cb @   17 : 25 03             Ldar a4
  133 E> 0x1e25e29944cd @   19 : 92 04             JumpIfToBooleanTrue [4] (0x1e25e29944d1 @ 23)
         0x1e25e29944cf @   21 : 25 02             Ldar a5
         0x1e25e29944d1 @   23 : 26 fa             Star r1
  151 S> 0x1e25e29944d3 @   25 : 25 fb             Ldar r0
         0x1e25e29944d5 @   27 : 92 04             JumpIfToBooleanTrue [4] (0x1e25e29944d9 @ 31)
         0x1e25e29944d7 @   29 : 25 fa             Ldar r1
         0x1e25e29944d9 @   31 : 26 f9             Star r2
  169 S> 0x1e25e29944db @   33 : a5                Return
Constant pool (size = 0)
Handler Table (size = 0)
[generated bytecode for function: CodeBlock2]
Parameter count 7
Frame size 0
   81 E> 0x1b1ed00944ba @    0 : a1                StackCheck 
   99 S> 0x1b1ed00944bb @    1 : 25 07             Ldar a0
         0x1b1ed00944bd @    3 : 92 14             JumpIfToBooleanTrue [20] (0x1b1ed00944d1 @ 23)
         0x1b1ed00944bf @    5 : 25 06             Ldar a1
  109 E> 0x1b1ed00944c1 @    7 : 92 10             JumpIfToBooleanTrue [16] (0x1b1ed00944d1 @ 23)
         0x1b1ed00944c3 @    9 : 25 05             Ldar a2
  112 E> 0x1b1ed00944c5 @   11 : 92 0c             JumpIfToBooleanTrue [12] (0x1b1ed00944d1 @ 23)
         0x1b1ed00944c7 @   13 : 25 04             Ldar a3
  117 E> 0x1b1ed00944c9 @   15 : 92 08             JumpIfToBooleanTrue [8] (0x1b1ed00944d1 @ 23)
         0x1b1ed00944cb @   17 : 25 03             Ldar a4
  121 E> 0x1b1ed00944cd @   19 : 92 04             JumpIfToBooleanTrue [4] (0x1b1ed00944d1 @ 23)
         0x1b1ed00944cf @   21 : 25 02             Ldar a5
  126 S> 0x1b1ed00944d1 @   23 : a5                Return 
Constant pool (size = 0)
Handler Table (size = 0)