我在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
答案 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> >
由于已经讨论了重构,我将简要介绍一下。由于上述情况有望显而易见,直接重构在所有情况下都不会是安全的。但是,我仍然建议使用这种或那种重构器。
我看到的两种可能情况是:
a.b
没有副作用,直接重构是安全的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.b
与var c = (a.b !== null) ? a.b : null;
我的猜测是,三元运算符中的null
除了null
之外都是其他任何值,如果你愿意的话,这是一个默认值。
答案 5 :(得分:-3)
这种令人困惑的奇怪语法的原因是因为a.b可能是空字符串或未定义,显然空字符串是有效输入。
另外,请注意:a.b可能是一个函数。