两者是一样的吗?
假设你有:
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