两者相同吗?
假设你有:
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!');
})();
操作/秒结果:
- 火狐:65152
- 铬:129045
传统If Else
const VALUE = true;
const TEST = false;
//test 2
if(VALUE && !TEST) {
console.log('print me!');
}
操作/秒结果:
- 火狐:65967
- 铬:130499
结论
正如您所看到的,在性能方面没有太大的差异,但传统的If Else在大多数情况下都以一个微不足道的数字战胜了Conditional Arrow Invocation。这可能与动态创建隐式函数有关。
我还意识到Chrome的JavaScript比FireFox的JavaScript执行速度快得多。
下面是jsperf链接,您可以运行该链接来自行评估。
https://jsperf.com/conditional-methods-vs-traditional-if-else/1