为什么"严格"在undefined vs false时测试

时间:2016-09-01 13:11:44

标签: javascript

我有一个这样的对象:



function doit() {
  var current_mods = {
    alt: false,
    shift: false
  };

  var required_mods = {};

  for (var modname in current_mods) {
    if (current_mods[modname] != required_mods[modname]) {
      alert('mismatch');
      return;
    }
  }

  alert('matched');
}
doit();




它一直告诉我不匹配。但是我没有做!==,不应该{0}返回假,因为它们都是假的?

2 个答案:

答案 0 :(得分:2)

==!=比较的规则规定,当其中一个值为布尔值时,不同类型的两个值的比较应该通过将布尔值转换为数字然后继续来完成。因此,您的false转换为0,并将比较视为

undefined != 0

反过来,从比较过程结束到false的默认结果。

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

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

答案 1 :(得分:1)

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

根据ECMAScript规范(http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison),undefined不等于false