两者相同吗?
假设你有:
var x = true;
然后你有一个:
x && doSomething();
或者
if(x) doSomething();
这两种语法之间有什么区别吗?我是不是偶然发现了一点糖?
两者相同吗?
假设你有:
var x = true;
然后你有一个:
x && doSomething();
或者
if(x) doSomething();
这两种语法之间有什么区别吗?我是不是偶然发现了一点糖?
严格来说,它们会产生相同的结果,但如果将前一种情况用作其他情况的条件,则会得到不同的结果。这是因为在 的情况下x && doSomething()
,doSomething()
将返回一个值来表示其成功。
不,它们并不相同。whileif
是一个语句,AND
操作符是一个表达式。
这意味着您可以在其他表达式中使用它的结果,而不能使用 if 语句:
var result = x && doSomething();
但是,在您的情况下,两者都具有相同的效果。使用更具可读性并更好地代表您的程序结构的一种;我建议使用 if 语句。
@Steve 陈述的 Ax && doSomething()
是一个表达式,
而是if(x) doSomething();
一个陈述,
正如@Daniel Li 和@Bergi 所建议的那样,思考:
计算一个表达式(应该在这里返回一个值)。
声明了一个语句(不应该在这里返回一个值,想想副作用)。
( thatExpression );
thatExpression;
两者都假设某种doNothingWithValueOf
陈述。
您是否使用:
doSomething()
作为
IsMyObjectWhatever()
或MyObjectComputedValue()
,ModifyMyObject()
然后:你用x && doSomething()
作为表达吗?
你最终会想到任何thisStatement( thatExpression );
地方,想想:
()
表达,;
陈述。显而易见的是“它有效”。不代表“这是对的”。
如果不那么明显的是什么时候会有所作为:
()(()())()();
可以是 对的,(;)
是 错的。总之,不,这两个陈述并不相等,尽管在您提出的特定情况下结果是相同的。
x && doSomething();
是一个表达式,首先是x
求值的,因为这是一个 AND 并且因为x
为真,doSomething()
然后对第二个参数 ( ) 求值。在这种情况下,这意味着该方法被执行。如果x
为假,则不会执行 doSomething(),因为表达式的结果不能为真。
if(x) doSomething();
是一个声明。检查 x 的值,如果为真,则执行 if 语句的范围。
我把这个小提琴放在一起来演示(稍作修改)。
来玩侦探吧
我们将第一种方法称为条件箭头调用,将第二种方法称为“传统的 If Else”。
我们将在jsperf 中创建两个单独的案例来评估这两种方法的公平性。
const VALUE = true;
const TEST = false;
//test 1
VALUE && !TEST && (() => {
console.log('print me!');
})();
操作/秒结果:
const VALUE = true;
const TEST = false;
//test 2
if(VALUE && !TEST) {
console.log('print me!');
}
操作/秒结果:
如您所见,在性能方面没有太大差异,但在大多数情况下,传统 If Else以微不足道的小数字赢得了条件箭头调用。这可能与动态创建隐式函数有关。
我还意识到 Chrome 的 JavaScript 比 FireFox 的 JavaScript 执行快得多。
这是 jsperf 链接,您可以运行它来自己评估。
https://jsperf.com/conditional-methods-vs-traditional-if-else/1