两者是否相同?
假设你有:
var x = true;
然后你有其中一个:
x && doSomething();
或
if(x) doSomething();
两种语法之间有什么不同之处吗?我偶然发现了一点糖吗?
答案 0 :(得分:6)
严格来说,他们会产生相同的结果,但如果你使用前一种情况作为其他事情的条件,你会得到不同的结果。这是因为在x && doSomething()
的情况下,doSomething()
会返回一个值来表示其成功。
答案 1 :(得分:6)
if
是语句,但AND
运算符是表达式。
这意味着您可以在其他表达式中使用其结果,而不能使用if语句:
var result = x && doSomething();
然而,在你的情况下,两者都有相同的效果。使用更易读的,更好地代表您的程序结构;我推荐if语句。
答案 2 :(得分:1)
总而言之,这两个陈述并不相等,但在特定情况下,您所呈现的结果是相同的。
x && doSomething();
是一个表达式,首先评估x
,因为这是一个AND,因为x
为真,所以第二个参数(doSomething()
)会被评估。在这种情况下,这意味着执行该方法。如果x
为false,那么doSomething()将不会被执行,因为表达式的结果不能为真。
if(x) doSomething();
是一个声明。检查x的值,如果为true,则执行if语句的范围。
我已将这个fiddle放在一起进行演示(稍加修改)。
答案 3 :(得分:0)
让我们扮演侦探。
我们将第一种方法称为 Conditional Arrow Invocation (有条件的箭头调用),而将第二种方法称为 Tifraditional 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!');
}
运/秒结果:
如您所见,在性能上并没有太大的区别,但是在大多数情况下,传统如果不是其他在条件箭头调用方面的优势很小。这可能与动态创建隐式函数有关。
我还意识到Chrome的JavaScript比FireFox的JavaScript执行速度快得多。
这里是jsperf链接,您可以运行该链接自己进行评估。
https://jsperf.com/conditional-methods-vs-traditional-if-else/1