<boolean expression> && statement() 和 if(<boolean expression>) statement() 一样吗?

IT技术 javascript syntax if-statement boolean syntactic-sugar
2021-01-22 11:29:07

两者相同吗?

假设你有:

var x = true;

然后你有一个:

x && doSomething();

或者

if(x) doSomething();

这两种语法之间有什么区别吗?我是不是偶然发现了一点糖?

5个回答

严格来说,它们会产生相同的结果,但如果将前一种情况用作其他情况的条件,则会得到不同的结果。这是因为在 的情况下x && doSomething()doSomething()将返回一个值来表示其成功。

我可以将语法用于其他类型的语句吗?反正都是表情,不是吗?我的意思是,var x; <boolean expr> && x = 'boolean expr was true';即使不涉及方法调用,任何if(condition)跟在 the&&后面的语句都可以产生相同的结果吗?
2021-03-15 11:29:07
任何计算结果为值的表达式都可以包含在布尔运算中。
2021-03-23 11:29:07
js 表达式中的所有语句不都是如此吗?
2021-04-03 11:29:07

不,它们并不相同。whileif是一个语句AND操作符是一个表达式

这意味着您可以在其他表达式中使用它的结果,而不能使用 if 语句:

var result = x && doSomething();

但是,在您的情况下,两者都具有相同的效果。使用更具可读性并更好地代表您的程序结构的一种;我建议使用 if 语句。

@AdrienBe:这些链接应该告诉我什么?
2021-03-23 11:29:07
为有兴趣了解有关 javascript 的更多信息statement以及expression您在答案中提到的人提供的一些进一步阅读,即。差异、关键字等
2021-04-12 11:29:07

简短的回答:没有

长答案:

@Steve 陈述的 Ax && doSomething()是一个表达式

而是if(x) doSomething();一个陈述

正如@Daniel Li 和@Bergi 所建议的那样,思考:

  • 计算一个表达式(应该在这里返回一个值)。

  • 声明了一个语句应该在这里返回一个值,想想副作用)。

为什么会令人困惑?

  • JS 允许我们写 ( thatExpression );
  • JS 允许我们写 thatExpression;

两者都假设某种doNothingWithValueOf陈述。

如何选择?

您是否使用:

  • doSomething() 作为
    • 表达,思考IsMyObjectWhatever()MyObjectComputedValue()
    • 或者作为声明,认为 ModifyMyObject()

然后:你用x && doSomething()作为表达吗?

你最终会想到任何thisStatement( thatExpression );地方,想想:

  • () 表达,
  • ; 陈述。

那我为什么要选择呢?

总之,不,这两个陈述并不相等,尽管在您提出的特定情况下结果是相同的。

x && doSomething();是一个表达式,首先是x求值的,因为这是一个 AND 并且因为x为真,doSomething()然后对第二个参数 ( ) 求值。在这种情况下,这意味着该方法被执行。如果x为假,则不会执行 doSomething(),因为表达式的结果不能为真。

if(x) doSomething();是一个声明。检查 x 的值,如果为真,则执行 if 语句的范围。

我把这个小提琴放在一起来演示(稍作修改)。

所有表达式都作为独立语句有效吗?
2021-03-19 11:29:07

来玩侦探吧

我们将第一种方法称为条件箭头调用,将第二种方法称为“传统的 If Else”

我们将在jsperf 中创建两个单独的案例来评估这两种方法的公平性。

条件箭头调用

const VALUE = true;
const TEST = false;

//test 1
VALUE && !TEST && (() => {
    console.log('print me!');
})();

操作/秒结果:

  1. 火狐:65,152
  2. 铬:129,045

传统的如果其他

const VALUE = true;
const TEST = false;

//test 2
if(VALUE && !TEST) {
    console.log('print me!');
}

操作/秒结果:

  1. 火狐:65,967
  2. 铬:130,499

结论

如您所见,在性能方面没有太大差异,但在大多数情况下,传统 If Else以微不足道的小数字赢得了条件箭头调用。这可能与动态创建隐式函数有关。

我还意识到 Chrome 的 JavaScript 比 FireFox 的 JavaScript 执行快得多。

这是 jsperf 链接,您可以运行它来自己评估。

https://jsperf.com/conditional-methods-vs-traditional-if-else/1