如果a为假,那么如果(a)=== if(false)?

时间:2016-05-19 17:11:16

标签: javascript control-flow

我正在互动网站上进行JavaScript练习,我真的需要一些帮助来理解这背后的逻辑......

练习要求您定义变量编程,并将其设置为false。

var programming = false;

然后,如果编程等于false,则函数happy将返回true。

programming已经设置为false,所以我的第一个想法就是写:

if (programming) {
    // this

我犯了不使用的错误!运算符,这是他们要求的,所以我试着写:

if (!!programming) {
    // this

对我而言,这说:not not false我认为会取消并等于false

但是我收到以下错误:

  

哎呀,再试一次。当编程为真时,看起来你的快乐函数返回true而不是false

这有效:

if (!programming) {
    // this

我只是不明白为什么(!编程)评估为false,当我相信这基本上是这样说:(!false)

请帮助我理解我的方式错误。谢谢。

作为参考,这是我的完整代码:

var programming = false;
var happy = function() {
  if (!programming) {
      return true;
  } else {
      return false;
  };
};

编辑:

我找到了解决方案。 zystvan在这篇文章中解释了它:https://discuss.codecademy.com/t/why-is-this/42458

8 个答案:

答案 0 :(得分:8)

  

我只是不明白为什么(!编程)评估为false,当我相信这基本上是这样说:(!false)

此语法:

if (!programming) {
}

基本上是简称:

if (programming != true) {
}

这是另一种写作方式:

if (programming == false) {
}

我认为不理解这是你混淆的根源。

另外请注意以下事项:

var programming = true;
programming;   // true
!programming;  // false
!!programming; // true

programming = false;
programming;   // false
!programming;  // true
!!programming; // false

所以你的程序可以缩短为:

var programming = false;
var happy = function() {
    return !programming; // returns true when programming is false
};

答案 1 :(得分:1)

if (programming)并不意味着“如果编程被设置为假”,那实际上恰恰相反!简单if块的语法如下:

if (condition) { action }

它按以下方式执行:

if condition evaluates to true, then execute the action

练习要求您仅在编程为假时执行操作。 “编程是假的”是你的条件。你知道它现在是正确的,所以你也可以写if (true) { action }或简单地action,但你的练习可能会考虑这种作弊(通常条件不会那么明显)。

因此,当且仅当true为假时,您需要生成一个评估为programming的条件。您可以使用比较运算符==!=,或运动提示的否定运算符!

答案 2 :(得分:1)

编辑:您刚刚发布的图片包含与您的问题中粘贴的代码不同的代码。您的问题已经使用!编程,但您的图像显示!!编程。将其更改为!编程(根据您的问题),它应该没问题。

我认为你的程序是正确的 - 你确定你正确执行了它并且你确定测试是正确的吗?

将代码粘贴到节点中会产生以下内容......

> var programming = false;
> var happy = function() {
...   if (!programming) {
.....       return true;
.....   } else {
.....       return false;
.....   };
... };
> happy();
true
> programming = true; happy();
false
> programming = undefined; happy();
true
> programming = null; happy();
true

...所以当编程为真时,你的代码会返回false,这是期望的结果并且与测试结果相反?

  

哎呀,再试一次。当编程为真时,看起来你的快乐函数返回true而不是false

你可以将你的功能BTW缩短为:

var  happy = function() { return !programming; }

最后要注意上面的评论

!programming

相当于

programming != true

如果编程具有非布尔值,则不一定如此!例如,考虑以下内容:

> programming = 5;
5
> !programming
false
> programming != true;
true

或更好

> var sad = function(value) { return (!value) === (value != true) }
> sad(undefined)
true
> sad(null)
true
> sad(false)
true
> sad(true)
true
> sad(1)
true
> sad(2)
false
> sad("")
true
> sad("A")
false

答案 3 :(得分:0)

使用时:

if (!someVariable) {

}

它说“如果someVariable的值不是真的(除了null,undefined或false之外的任何值”),那么执行这个“if”的主体。

所以,当你这样做时:

var someVariable = false;

if (!someVariable) {
    //Since someVariable is not truthy, this will run
}

答案 4 :(得分:0)

var programming = false;
var happy = function() {
  if (!programming) {
      return true;
  } else {
      return false;
  };
};

相同
var programming = false;
var happy = function() {
  if (programming != true) {
      return true;
  } else {
      return false;
  };
};

所以你有两个案例

  • 编程= true
    • if(true!= true)=>不是真的=> else块被称为=>返回false
  • 编程= false
    • if(false!= true)=>是真的=> if block被调用=>返回true

答案 5 :(得分:0)

我认为你可能有更多的分号会导致执行时间冲突,所以如果函数没有正确执行,那么变量将设置为null,并且你得到一个False作为回报。

尝试删除第二个分号,如:

var programming = false;
var happy = function() {
  if (!programming) {
      return true;
  } else {
      return false;
  }
};

答案 6 :(得分:0)

'true'或'false'有时甚至会让有经验的程序员感到困惑。

不要将'true'或'false'计算在内,而应将其视为“成功”和“失败”。表达式可以是“成功”或“失败”。

if(expression){
  I'll be only executed when 'expression' is a success exp.
}

所以当你写

var programming = false;
if(programming){}

编程是一个失败表达式,所以“if”中的任何内容都会被执行。

答案 7 :(得分:0)

如果parens中的语句评估为true / truthy,则

... if语句执行以下代码块。

由于某些原因,您编写的所有内容都假设由于您的var为false,因此它应该传递if语句。我不知道你从哪里得到这个想法。

所以是的,编程为false的if (programming)将不会执行后面的if语句中的代码。

同样地,你是正确的!!只会将它翻转两次,回到它最初的任何布尔值(真实或虚假到真假)......它原来是{{1所以是的,if语句不会传递而不执行代码。

false!值翻转为false,这会使其通过true语句。所以是的,如果你想要一个变量来传递if语句,如果值为false,那么if正是你要做的。它没有评估if (!programming) ...它正在评估false,这就是它传递true语句的原因。