Javascript 为什么;严格的;未定义与错误时的测试

Javascript 为什么;严格的;未定义与错误时的测试,javascript,Javascript,我有一个这样的物体: 函数doit(){ var电流_模块={ alt:错, 移位:假 }; var required_mods={}; for(当前_mods中的变量modname){ if(当前的_mods[modname]!=必需的_mods[modname]){ 警报(“不匹配”); 返回; } } 警报(“匹配”); } doit()关于==和的规则=比较说明,当两个不同类型的值中有一个是布尔值时,应通过将布尔值转换为数字然后继续进行比较。因此,您的false将转换为0,并将比较视为

我有一个这样的物体:

函数doit(){
var电流_模块={
alt:错,
移位:假
};
var required_mods={};
for(当前_mods中的变量modname){
if(当前的_mods[modname]!=必需的_mods[modname]){
警报(“不匹配”);
返回;
}
}
警报(“匹配”);
}

doit()关于
==
的规则=比较说明,当两个不同类型的值中有一个是布尔值时,应通过将布尔值转换为数字然后继续进行比较。因此,您的
false
将转换为
0
,并将比较视为

undefined != 0
这反过来会在比较过程结束时下降到默认结果
false

测试对象属性值是一个复杂的过程,因为当属性根本不存在,或者当属性存在但没有值时,像
obj[prop]
这样的表达式将计算为
undefined
。根据需要,您可以将
中的
运算符与值测试结合使用:

  if (modname in required_mods) {
    if (current_mods[modname] !== required_mods[modname])
      alert("value mismatch");
  }
  else
    alert("property " + modname + " missing");

这两个值都是假的并不意味着它们相等


根据ECMAScript规范(),
undefined
不等于
false

它们并不都是false。未定义等于零,甚至不等于未定义不确定为什么这个问题被否决。写得很好你在这个网站上的名声太大了,因为这样一个基本问题可以通过在你的浏览器控制台中键入
undefined==false来回答…啊,@AndréDion,我明白了now@bub他们确实都是“虚伪的”,但这并不重要。在
=
的规则下,
未定义是
==`to本身和
null
@Noitidart,注意
未定义==undefined
真的
,正如
未定义==null
一样。感谢pointy的提示,我刚刚测试并实现了它。所以对于我上面的例子,我应该使用的if是:
if(!current_mods[modname]!=!required_mods[modname]){
if(!!current_mods[modname]!=!!required_mods[modname])
@Noitidart
!!
向boolean@Noitidart嗯,我不确定这是不是一个好的解决方案;
!!
将把所有的truthy值转换为
true
,而这似乎不是您为代码设定的目标。