我在JavaScript代码中找到了这个字符串。
var c = (a.b !== null) ? a.b : null;
这是if-else语句的简写,但是如果值为null,则赋值为null。总是等同于
var c = a.b
是否包括所有情况-异常、null、未定义等?
换句话说,这些行(总是)等价吗?
var c = (a.b !== null) ? a.b : null;
-vs-
var c = a.b
发布于 2015-08-11 18:43:24
不,如果b是一个更新变量的方法,它们不一定总是等于。不过,以这种方式编写代码是一种糟糕的做法
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);
发布于 2015-08-12 06:18:56
这些语句在逻辑上与等价。
话虽如此,正如在another answer中提到的,如果a.b
有副作用,这些语句将不会导致相同的程序状态。
这一点很明显,如果a.b
修改了程序中其他地方的某些内容,则var c
会根据执行这些语句中的哪些语句而具有不同的值,或者更隐蔽。
重构
由于重构已经讨论过了,所以我将简要介绍一下。正如上面所说的,直接重构并不是在所有情况下都是安全的。然而,我仍然推荐这样或那样的重构。
我认为有两种可能的情况:
a.b
没有副作用,直接重构是safea.b
有隐藏的副作用。这代表了非常不清楚,令人困惑,甚至是彻头彻尾的错误代码。它应该被重构,以便在声明过程中发生的所有更改对读者来说都是清晰和明显的(希望是直观的,并得到注释的支持)。发布于 2015-08-12 10:43:54
正如@potatopeelings已经指出的那样,这两种可能的陈述并不总是等价的,因为一个人可以编写晦涩的代码,这将产生不同的结果。
但是,如果我看到一个代码,比如
var c = (a.b !== null) ? a.b : null;
我将假设代码的意图是
var c = a.b;
因此,我将对其进行更改以使代码更美观。如果我会感到负面的惊讶,也就是说,由于这个变化,代码没有通过测试阶段,那么我会试着找到a.b
的作者,并将其归咎于git。
因此,我的答案是,这两个语句不是等价的,但在编写良好的代码中应该是等价的。
https://stackoverflow.com/questions/31939218
复制相似问题