未定义的变量,值== false与!值

Ces*_*sco 39 javascript

我用Javascript编写的一段非常简单的代码有问题,你能帮帮我吗?

以下是我认为到目前为止我对javascript和变量的理解:

  • 在布尔运算中,未定义的值被计算为false
  • 通过在比较中使用==运算符,您可以询问两个值是否具有可比性,无论其类型如何

我在一个在线课程中找到了一个练习文件,我试图这样做,但是我没有在课程中得到相同的结果; 主要问题是我通过"if value == false {...}"比较值,而解决方案是使用"if!value {...}"

所以我决定写一个非常短的代码,以便自己尝试,但我的结果好坏参半.在下面的示例中,我希望这个JS代码生成两个相同的警报("foo等于false"),但是第一个if语句返回"foo IS not equal false",而第二个if返回(如预期的那样) "foo等于假".

这就是我写的:

var foo = undefined;

if (foo == false) {
  alert("foo is equal to false");
} else {
  alert("foo is not equal to false"); // Javascript executes this row
}

if (!foo) {
  alert("foo is equal to false");  // Javascript executes this row
} else {
  alert("foo is not equal to false");
}
Run Code Online (Sandbox Code Playgroud)

AFAIK这两个IF应该做同样的工作,事实上当我尝试通过在第一行替换值"var foo = undefined;"时 用"var foo = 0;" 它按预期工作,0是另一个应该被评估为false的值,或者至少这是我记得的.

你能告诉我我做错了什么吗?

小智 41

==算法(摘要相等比较算法)是不是在那里你可以简单地假设一个结果,除非你知道的算法.您需要了解其工作原理的详细信息.

例如,null并且undefined是一个特例.除了被认为彼此相等之外,它们不进行任何类型转换.

否则,通常会进行类型转换,尝试将两个操作数减少为通用类型.这通常最终成为toNumber转换.

这就是为什么:

  • null == undefined; // true

  • null == 0; // false

  • +null == '0' // true

因此,如果你知道算法是如何工作的,你知道undefined除了undefined和之外永远不等于任何东西null,但是其他不严格相等的类型可能被强制转换为相等的类型.

所以做if(!x)vs if(x==false)是完全不同的测试.

  • if(!x)执行toBoolean转换.

  • if(x == false) 使用复杂的算法来决定正确的转换.

所以......

if(x == false)
Run Code Online (Sandbox Code Playgroud)

......如果xundefined,则确定不等于false,但如果x0或甚至"0",它将被视为等于false.

  • 0 == false; // true

  • "0" == false; // true

  • @mrReiha:ECMAScript语言规范中详细介绍了这一点.这是[抽象等式比较算法]的链接(https://es5.github.io/#x11.9.3) (2认同)

kaz*_*kaz 12

undefined不等于false,但是当你试图评价时:

if (undefined)
Run Code Online (Sandbox Code Playgroud)

整个表达总是假的

更多信息:http://www.mapbender.org/JavaScript_pitfalls : _null, _false,_undefined,_NaN


Mik*_*uel 5

真与等true是JavaScript中的两件事。

if (...)如果执行的第一个语句...是“ truthy ”,而不是当他们是“平等”到任何其他特定值,那么你的第二个条件应该像

if (!foo) {
  alert("foo is falsy");  // Javascript executes this row
} else {
  alert("foo is truthy");
}
Run Code Online (Sandbox Code Playgroud)

有相当多的“falsy”值在JavaScript: ,NaN""0-0false,。null undefined其他所有值为truthy

!运营商的回报false的任何truthy价值,true任何falsy价值,所以!x是一样的(x ? false : true)所有x