通过对象比较来背靠背或大门。混乱

时间:2017-07-06 05:54:58

标签: javascript

简单地说,我不明白为什么他们在第二个if语句没有为示例返回false(null,null)

function deepEqual(a, b) {
  if (a === b) return true;

  if (a == null || typeof a != "object" ||
      b == null || typeof b != "object")
    return false;

  var propsInA = 0, propsInB = 0;

  for (var prop in a)
    propsInA += 1;

  for (var prop in b) {
    propsInB += 1;
    if (!(prop in a) || !deepEqual(a[prop], b[prop]))
      return false;
  }

  return propsInA == propsInB;
}

var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true

7 个答案:

答案 0 :(得分:0)

来自===的定义。

正如Mozilla docs中所提到的那样,这实际上归结为x === y的{​​{3}},其中(null, null)表示:

  

...   1.如果Type(x)与Type(y)不同,则返回false。

     

...   3.如果Type(x)为Null,则返回true。

     

...

如果您使用null === null调用您的函数,则:

  1. 类型(x)和类型(y)相同
  2. 类型(x)为空

    truenull

答案 1 :(得分:0)

使用definition from Ecma true值的ECMA将始终返回false

所以 - 当你传递null值时,你的函数将从不返回if - 因为它总是会遇到第一个a === b条件,{{ 1}}和return true;return语句会停止执行,并且永远不会达到第二个if条件。

答案 2 :(得分:0)

如果您的代码执行return,则不会执行下一个代码..

答案 3 :(得分:0)

交换你的if语句。因为return将退出函数并返回null === null所以它将执行第一个循环并且不会进入下一个循环

function deepEqual(a, b) {

   if (a == null || typeof a != "object" ||
       b == null || typeof b != "object") {
       return false;
   }
    if (a === b) {
    return true;
   }

 }
var c = null;
 console.log(deepEqual(c, c));

答案 4 :(得分:0)

因为你正在返回。在第二个语句执行

之前

function deepEqual(a, b) {
  if (a === b) {
    //return true;
  }

  if (a == null || typeof a != "object" ||
    b == null || typeof b != "object") {
    return false;
  }
}
var c = null;
console.log(deepEqual(c, c));

答案 5 :(得分:0)

因为第一个陈述是真的,它从这里返回。返回后,下一行代码未执行。



function deepEqual(a, b) {
  if (a === b) {
    //return true;
  }

  if (a == null || typeof a != "object" ||
    b == null || typeof b != "object") {
    return false;
  }
}
var c = null;
console.log(deepEqual(c, c));




答案 6 :(得分:0)

正如其他人所提到的,你的函数会在第一个if语句ergo返回false时退出。

if (a === b) { return true; }

通常认为在您的函数中包含单个return语句是一种好习惯。在我们的例子中,我们可以将代码重构为:

function deepEqual(a, b) {
  var ret = false;
  if (a === b) {
    ret = true;
  } else if (a == null || typeof a != "object" ||
    b == null || typeof b != "object") {
    ret = false;
  }
  return ret;
}

这也迎合了另一个可能的问题。有一些a和b的值不会被if语句捕获并且会返回undefined。 e.g:

deepEqual([],{});