首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这几行JavaScript代码等价吗?

这几行JavaScript代码等价吗?
EN

Stack Overflow用户
提问于 2015-08-11 18:23:45
回答 6查看 3.6K关注 0票数 54

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

代码语言:javascript
复制
var c = (a.b !== null) ? a.b : null;

这是if-else语句的简写,但是如果值为null,则赋值为null。总是等同于

代码语言:javascript
复制
var c = a.b

是否包括所有情况-异常、null、未定义等?

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

代码语言:javascript
复制
var c = (a.b !== null) ? a.b : null;

-vs-

代码语言:javascript
复制
var c = a.b
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-08-11 18:43:24

不,如果b是一个更新变量的方法,它们不一定总是等于。不过,以这种方式编写代码是一种糟糕的做法

代码语言:javascript
复制
var log = 0;
var a = {
    get b() {
        log++;
        return log;
    }
}

var c = (a.b !== null) ? a.b : null;
// outputs 2
console.log(c);
代码语言:javascript
复制
var log = 0;
var a = {
    get b() {
        log++;
        return log;
    }
}

var c = a.b;
// outputs 1
console.log(c);
票数 94
EN

Stack Overflow用户

发布于 2015-08-12 06:18:56

这些语句在逻辑上与等价。

话虽如此,正如在another answer中提到的,如果a.b有副作用,这些语句将不会导致相同的程序状态。

这一点很明显,如果a.b修改了程序中其他地方的某些内容,则var c会根据执行这些语句中的哪些语句而具有不同的值,或者更隐蔽。

重构

由于重构已经讨论过了,所以我将简要介绍一下。正如上面所说的,直接重构并不是在所有情况下都是安全的。然而,我仍然推荐这样或那样的重构。

我认为有两种可能的情况:

  1. a.b没有副作用,直接重构是safe
  2. a.b有隐藏的副作用。这代表了非常不清楚,令人困惑,甚至是彻头彻尾的错误代码。它应该被重构,以便在声明过程中发生的所有更改对读者来说都是清晰和明显的(希望是直观的,并得到注释的支持)。
票数 19
EN

Stack Overflow用户

发布于 2015-08-12 10:43:54

正如@potatopeelings已经指出的那样,这两种可能的陈述并不总是等价的,因为一个人可以编写晦涩的代码,这将产生不同的结果。

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

代码语言:javascript
复制
var c = (a.b !== null) ? a.b : null;

我将假设代码的意图是

代码语言:javascript
复制
var c = a.b;

因此,我将对其进行更改以使代码更美观。如果我会感到负面的惊讶,也就是说,由于这个变化,代码没有通过测试阶段,那么我会试着找到a.b的作者,并将其归咎于git。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31939218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档