这几行JavaScript代码是等价的吗?
Are these lines of JavaScript code equivalent?
我在JavaScript代码中发现了这个字符串。
var c = (a.b !== null) ? a.b : null;
这是if-else语句的简写,但是如果值为空则赋值为null。ALWAYS不等于
吗?var c = a.b
包括所有情况-异常,null,未定义等?
换句话说,这些行(总是)相等吗?
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
有副作用,语句将不会导致相同的程序状态。
如果
a.b
修改了程序中的其他部分,则var c
根据执行哪条语句具有不同的值,或者更加隐藏,这很明显。重构
既然已经讨论过重构,我将简要地介绍一下。如上所述,直接重构在所有情况下都不是安全的。然而,我仍然会推荐这样或那样的重构。
我认为有两种可能的情况:
-
a.b
没有副作用,直接重构是安全的 -
a.b
有隐藏的副作用。这代表着非常不清楚,令人困惑,和彻头彻尾的坏代码。它应该被重构,以便所有语句中发生的变化是清晰和明显的读者(希望是直观的,以及支持的评论)。
正如@potatopeelings已经指出的那样,这两种可能的语句并不总是等价的,因为一个人可以编写晦涩的代码,这将产生不同的结果。
但是,如果我看到一个代码,比如var c = (a.b !== null) ? a.b : null;
我将假设代码的意图是
var c = a.b;
,所以我将改变它,使代码更漂亮。如果我感到消极的惊讶,也就是说,由于这个变化,代码没有通过测试阶段,那么我将尝试找到a.b
的作者与git的责任。
所以,我的答案是,这两个语句并不等价,但在编写良好的代码中应该是等价的。
实际上,甚至
var c = (a !== null) ? a : null;
保证等于
var c = a;
当a
被全局对象的getter或ES6代理处理程序解析时。
因此,这给c
赋值0:
Object.defineProperty(self, 'a', { get: function() { return c ^= 1; } });
var c = (a !== null) ? a : null;
console.log(c);
同时给c
赋值1:
Object.defineProperty(self, 'a', { get: function() { return c ^= 1; } });
var c = a;
console.log(c);
你是对的,var c = a.b
和var c = (a.b !== null) ? a.b : null;
是完全一样的
我的猜测是三元运算符中的null
意味着除了null
之外的任何东西,如果你愿意,这是一个默认值。
这种令人困惑的奇怪语法的原因是a.b可能是空字符串或未定义,显然空字符串是有效的输入。
同时注意:a.b可能是一个函数
相关文章:
- 云代码(javascript)失败,原因是:{代码:1,消息:内部错误
- 简化此If语句,使其不会't重复代码-Javascript
- 十进制到二进制代码Javascript
- 第二次单击时执行不同的代码(JavaScript)
- 在不使用jquery($symbol)knockout.js的情况下分离代码javascript
- 缩短几个元素的onclick代码 - JavaScript
- 英国银行排序代码 JavaScript 正则表达式
- 我无法在谷歌图表的代码 javascript 中获取 json 数据(项目 Python Hello Dashboard
- 和代码 JavaScript 没有被 &.
- 我怎样才能减少这段代码 javascript 代码,这样它就不会那么重复了
- 我想单击一个按钮,一次只执行已经制作的程序中的一行代码.(JavaScript)
- 滑动 DIV 代码 Javascript 的小问题
- 尝试重写代码 JavaScript
- 是否可以检测到在不使用键代码 javascript 的情况下按下了输入键
- 输入网址代码 JavaScript 播放器
- 管理通用客户端代码(javascript/css)
- 理解代码javascript
- 加载json-url参数代码(javascript修改)
- 变量检查错误的代码(javascript)
- css属性仅由代码javascript应用