我想知道两个JavaScript代码段是否相同

时间:2012-12-06 10:05:24

标签: javascript coding-style

我是JavaScript新手,我想了解更多信息。

例如:

a == true && alert("a is true");

这类似于:

if(a == true)
{
    alert("a is true");
}

如果上面的代码是正确的,如果它们都相同,那么我想知道所有这些运算符和条件。我在哪里可以找到它们?

7 个答案:

答案 0 :(得分:17)

答案:结果,即警告框,将是相同的。

说明:

大多数语言都是为了评估第二个表达式,只有在第一个表达式评估为true时才会出现&&表达式。

这意味着,如果a评估为falsenullundefined,空字符串,0NaN,{ {1}}将不会被评估,您将看不到警告框。

JavaScript的值可能是“真实”或“虚假”,我建议您在此处详细了解:http://11heavens.com/falsy-and-truthy-in-javascript

所以,这取决于你对“相同”的定义,结果,即看到或没有看到警告框,是相同的。


如果您想了解JavaScript中不同运算符的更多信息以及它们的工作原理,请查看:developer.mozilla.org/en-US/docs/JavaScript/Guide/Expressions_and_Operators

答案 1 :(得分:7)

两者之间的唯一区别是这是一个表达式:

a == true && alert("a is true");

但这是一个声明:

if (a == true) {
    alert('a is true');
}

表达式的结果取决于a == true评估的内容。

false && alert('a is true'); // false (and alert box does not show up)
true && alert('a is true');  // undefined (after alert box is clicked away)

这要归功于评估表达式的“短路”行为;使用&&,第一个错误的条件将成为表达式的结果,而不评估其余部分。

具有类似行为的另一个运算符是逻辑或||。考虑:

a || alert('a is false');

如果a评估为假,则显示警告框。

false || alert('a is false'); // undefined (after alert box is clicked away)
true || alert('a is false');  // true (alert box does not show up)

请注意,具有这些副作用的表达式被视为“聪明”的解决方案;它们可能会缩短您的代码,但原始意图并不总是很明显。

也就是说,这也有很好的用途,例如:

a = a || 'default value';

如果它是假的,则会将默认值指定给a,否则将指定原始值a。您可以经常看到这些表达式,它们是该语言的强大功能。

答案 2 :(得分:2)

这不是Javascript特殊语法 - 它只是缩短代码的技巧。

没有魔力。这只是一个简单的逻辑。通常,代码最小化器使用这些技巧来缩短代码。此行为基于&&和||运算符重要属性 - 如果从第一部分知道结果(与&和|运算符相反,它们总是计算表达式的两个部分),它们不会计算表达式的第二部分。

用法解释:

a==true && alert("a is true");

如果'a'为假 - javascript引擎分析整个表达式也必须是假的(因为'&&'(AND)逻辑运算符的含义) - 并且它省略了表达式的第二部分,因为无论什么它返回结果它不会改变整个表达式的结果。所以它不会运行'警报'。相反,如果'a'为真 - 比Javascript引擎需要知道表达式的第二部分的结果并且它运行'alert'。这种行为模仿了通常的'if'陈述。

a==false || alert("a is true");

这个使用'OR'逻辑运算符。如果'a'为假,则无需评估表达式的第二部分,并触发'alert'。如果'a'为真,则表达式的第二部分有可能为'true'且整个表达式的计算结果为'true' - 因此javascript引擎运行'alert'。

此外,这些捷径可以进一步缩短。因为不需要比较两个布尔值:'a'和'true',因为'a'已经是布尔值。它有以下几点:

a && alert("a is true");

基本上你不需要手动使用这些东西,只需使用普通的'if'语句 - 它将使你的代码可读。然后,您可以根据需要使用代码最小化来缩短生产代码。

快乐的编码!

答案 3 :(得分:1)

在其他答案中有很多很好的例子,&&如何运作,所以我不打算重复它们。反正...

评估表达式时,它会发送一个返回值作为结果。在您的特定情况下(第一个示例),返回值不会在任何地方使用,结果与第二个示例相同。但是如果我们使用该返回值,比如在if条件下,我们可能会得到一些令人困惑的结果。这是一个例子:

var a = true;
if (a == true && alert('a = true')) {
    alert('a really is true');
} else {
    alert('It seems, that a is not true');
}

此代码片段将首先警告“a = true”,第二个警报将是“看起来,这不是真的”。这是由于DOM本机函数alert()的返回值,它返回undefined,这使得条件为假(true && undefined === false)。因此,我们可以说,您的代码片段在该特定上下文中是相等的,但它们不在其他某些上下文中。

答案 4 :(得分:0)

他们都做同样的事情。这取决于您希望代码看起来如何,大多数(我认为)会同意第二个版本最好阅读。

If语句在出现错误时停止执行(在&&运算符的情况下),因此第一个语句说“如果a是真,那么如果警告...”,意思是如果a为真,则会显示警报。

这与第二版完全相同。

答案 5 :(得分:0)

这两组代码产生的结果相同但不一样

对于第一个代码集,

a == true && alert("a is true")

使用了logical operator &&

在使用&&评估语句时,false && anything的短路评估为false。

因此,如果a为false,则在第一个语句中不调用alert(1)。 js编译器跳过alert语句。

如果a为真,则执行alert(1),因为条件没有短路。

在第二组中,使用正常的if条件。请检查此link

答案 6 :(得分:-1)

这段代码做同样的事情,检查一下是否为真,然后调用函数提醒,我想我可以说是一样的。