<布尔表达式>&&statement() 与 if(<boolean expression>) 语句() 相同吗?



两者相同吗?

假设你有:

var x = true;

然后你有一个:

x && doSomething();

if(x) doSomething();

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

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

不,它们不完全相同。虽然if语句,但AND运算符是表达式

这意味着你可以在另一个表达式中使用它的结果,而不能用if语句:

var result = x && doSomething();

然而,在你的情况下,两者都有相同的效果。使用可读性更强、更能代表程序结构的程序;我推荐if语句。

简短回答:

长话短说:

由@Stevex && doSomething()声明的A是表达式

if(x) doSomething();语句

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

  • 计算表达式(此处应返回值)。

  • 声明了语句(而不是应该在此处返回值,想想副作用)。

为什么它令人困惑

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

都假设了某种doNothingWithValueOf语句。

如何选择

你用吗

  • doSomething()作为
    • 表达式,想想IsMyObjectWhatever()MyObjectComputedValue()
    • 或者作为一种陈述,想想ModifyMyObject()

然后:是否将x && doSomething()用作表达式

你最终会在任何地方都想到类似thisStatement( thatExpression );的东西,想想:

  • CCD_ 16表达
  • ;语句

那我为什么要选择呢

  • 显而易见的是;它有效"不代表";这是对的;。

  • 如果时不太明显,则会产生差异:

    • 只是认为()(()())()();可以是(;)
    • check@wwaawaw Javascript:语句和表达式之间的区别
    • 或Axel Rauschmayer发布的表达式与声明

总之,这两种说法是不相等的,尽管在特定的情况下,结果是相同的。

x && doSomething();是一个表达式,首先计算x,因为这是一个AND,并且由于x为真,所以随后计算第二个自变量(doSomething())。在这种情况下,这意味着该方法被执行。如果x为false,则不会执行doSomething(),因为表达式的结果不能为true。

if(x) doSomething();是一个语句。检查x的值,如果它为true,则执行if语句的作用域。

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

让我们扮演侦探。

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

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

条件箭头调用

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

操作/秒结果:

  1. 火狐:65152
  2. 铬:129045

传统If Else

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

操作/秒结果:

  1. 火狐:65967
  2. 铬:130499

结论

正如您所看到的,在性能方面没有太大的差异,但传统的If Else在大多数情况下都以一个微不足道的数字战胜了Conditional Arrow Invocation。这可能与动态创建隐式函数有关。

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

下面是jsperf链接,您可以运行该链接来自行评估。

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

最新更新