这些JavaScript代码是否相同?

时间:2015-08-11 10:23:45

标签: javascript if-statement

我在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

6 个答案:

答案 0 :(得分: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);
var log = 0;
var a = {
    get b() {
        log++;
        return log;
    }
}

var c = a.b;
// outputs 1
console.log(c);

答案 1 :(得分:20)

这些陈述 逻辑等效。

话虽如此,正如another answer所述,如果a.b有副作用,这些陈述将不会产生相同的程序状态。

如果var c修改程序中其他地方的某些内容,a.b具有不同的值,具体取决于执行这些语句,或者更隐蔽。{br> >

重构

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

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

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

答案 2 :(得分:1)

正如@potatopeelings已经指出的那样,两个可能的语句并不总是等价的,因为人们可以编写模糊的代码,这会产生不同的结果。

但是,如果我看到代码,比如

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

我将假设代码的意图是

var c = a.b;

所以我会改变它以使代码更漂亮。如果我会感到非常惊讶,也就是说,由于这个变化,代码没有通过测试阶段,那么我将尝试用git blame找到a.b的作者。

所以,我的答案是,这两个语句不是等价的,但在编写良好的代码中应该是等价的。

答案 3 :(得分:0)

嗯,实际上甚至没有

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

保证等同于

var c = a;

当全局对象上的getter或ES6代理处理程序解析a时。

因此,例如,这将c分配给值0:

Object.defineProperty(self, 'a', { get: function() { return c ^= 1; } });
var c = (a !== null) ? a : null;
console.log(c);

虽然这会将值{1}分配给c

Object.defineProperty(self, 'a', { get: function() { return c ^= 1; } });
var c = a;
console.log(c);

答案 4 :(得分:-1)

您说得对,var c = a.bvar c = (a.b !== null) ? a.b : null;

完全相同

我的猜测是,三元运算符中的null除了null之外都是其他任何值,如果你愿意的话,这是一个默认值。

答案 5 :(得分:-3)

这种令人困惑的奇怪语法的原因是因为a.b可能是空字符串或未定义,显然空字符串是有效输入。

另外,请注意:a.b可能是一个函数。