这些JavaScript代码行是否等同?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

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

var c = (a.b !== null) ? a.b : null;

这是if-else语句的缩写,但如果为null,则会分配值null。这不总是相当于

var c = a.b

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

换句话说,这些线(总是)是否相等?

var c = (a.b !== null) ? a.b : null; var c = a.b

提问于
用户回答回答于

不,如果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);
var log = 0;
var a = {
    get b() {
        log++;
        return log;
    }
}

var c = a.b;
// outputs 1
console.log(c);
用户回答回答于

这些陈述在逻辑上是等同的。

这就是说,正如在另一个答案中提到的那样,如果a.b有副作用,这些语句不会导致相同的程序状态。

var c如果a.b在程序中的其他位置修改了某些内容,则可以根据这些语句执行哪个具有不同的值,或者更加隐藏,这可能是显而易见的。 重构

由于重构已经被讨论过了,我会简单介绍一下。正如上面希望显而易见的那样,直接重构在所有情况下都是不安全的。不过,我仍然会推荐这样或那样的重构。

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

  1. a.b 没有副作用,直接重构是安全的
  2. a.b有隐藏的副作用。这代表非常不明确,令人困惑,并且只是彻头彻尾的坏代码。它应该被重构,以便在陈述过程中发生的所有变化对读者来说都是清晰而明显的(希望直观,所以以及评论支持)。

扫码关注云+社区