8

两者是一样的吗?

假设你有:

var x = true;

然后你有一个:

x && doSomething();

或者

if(x) doSomething();

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

4

5 回答 5

7

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

于 2012-09-30T19:22:29.027 回答
6

不,它们不相同。Whileif是一个语句AND运算符是一个表达式

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

var result = x && doSomething();

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

于 2012-09-30T19:27:21.847 回答
3

简短的回答:没有。

长答案:

@Steve 声明的 Ax && doSomething()是一个表达式

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

正如@Daniel Li 和@Bergi 所建议的,认为:

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

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

为什么会让人困惑?

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

两者都假设某种doNothingWithValueOf陈述。

如何选择?

你使用:

  • doSomething()作为一个
    • 表达,思考IsMyObjectWhatever()MyObjectComputedValue()
    • 或作为陈述,认为ModifyMyObject()

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

你最终会想到thisStatement( thatExpression );无处不在的东西,想想:

  • ()表达,
  • ;陈述。

那我为什么要选择?

于 2015-05-03T10:52:05.053 回答
1

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

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

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

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

于 2012-09-30T19:49:24.957 回答
0

来玩侦探吧。

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

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

条件箭头调用

const VALUE = true;
const TEST = false;

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

操作/秒结果:

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

传统的 If Else

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

于 2018-11-20T08:57:26.863 回答