这些JavaScript代码行是否相同?

Har*_*iec 54 javascript if-statement

我在JavaScript代码中找到了这个字符串.

var c = (a.b !== null) ? a.b : null;
Run Code Online (Sandbox Code Playgroud)

这是if-else语句的简写,但如果为null,则赋值null.这不总是相当于

var c = a.b
Run Code Online (Sandbox Code Playgroud)

包括所有情况 - 例外,null,undefined等?

换句话说,这些线(总是)是等价的吗?

var c = (a.b !== null) ? a.b : null;
Run Code Online (Sandbox Code Playgroud)

航班吗

var c = a.b
Run Code Online (Sandbox Code Playgroud)

pot*_*ngs 94

不,如果b是更新变量的getter,则它们总是不相等.以这种方式编码是不好的做法

var log = 0;
var a = {
    get b() {
        log++;
        return log;
    }
}

var c = (a.b !== null) ? a.b : null;
// outputs 2
console.log(c);
Run Code Online (Sandbox Code Playgroud)
var log = 0;
var a = {
    get b() {
        log++;
        return log;
    }
}

var c = a.b;
// outputs 1
console.log(c);
Run Code Online (Sandbox Code Playgroud)

  • @musefan - 如果问题是这些行**总是**等价与否,答案是可靠的否:-) (21认同)
  • @Allan Chua.是的,所以它可能是任何东西:-)只是想我会扔在那里.干杯! (5认同)
  • 很好的抓住.在实践中,即使有人编码这种暴行,在一行中增加两次"log"也可能是非预期的行为,除非有人随后出现并对凌乱的bug实施了一个混乱的修复,例如(`var c =(ab) !== null)?ab:null; log--; //因为我无法弄清楚为什么它会增加2`).你切片的任何方式,这都是错误的代码. (4认同)
  • 非常好,错过了其他人的案例.不常用,但很好,谢谢! (2认同)

Riv*_*ver 20

这些陈述在逻辑上是等价的.

话虽如此,并且如另一个答案所述,如果a.b有副作用,这些陈述将不会导致相同的程序状态.

这可以很容易地以var c具有不同值的形式显而易见,这取决于执行这些语句中的哪一个,或者如果a.b修改程序中的其他内容则更隐蔽.

重构

由于已经讨论了重构,我将简要介绍一下.由于上述情况有望显而易见,直接重构在所有情况下都不安全.但是,我仍然建议使用这种或那种重构器.

我看到的两种可能情况是:

  1. a.b 没有副作用,直接重构是安全的
  2. a.b有隐藏的副作用.这代表了非常不清楚,令人困惑,只是彻头彻尾的糟糕代码.它应该被重构,以便在语句中发生的所有更改对于读者来说都是清楚和明显的(希望直观地如此,以及由评论支持).