`

areEqual

 
阅读更多

areEqual用于比较引用类型或基本类型数据是否完全相等。

 

'use strict';

var aStackPool = [];
var bStackPool = [];

// 完全相等比较
function areEqual(a, b) {
  // aStackPool、bStackPool有值时取出,通常经过一次比较后aStackPool、bStackPool存入单个空数组元素;无值时取空数组
  var aStack = aStackPool.length ? aStackPool.pop() : [];
  var bStack = bStackPool.length ? bStackPool.pop() : [];

  var result = eq(a, b, aStack, bStack);

  // 比较完成后清空aStack和bStack,仍然保持为数组形式
  aStack.length = 0;
  bStack.length = 0;

  // aStackPool、bStackPool存入单个空数组元素,下次比较时取出,aStackPool、bStackPool长度不会递增
  aStackPool.push(aStack);
  bStackPool.push(bStack);

  return result;
}

function eq(a, b, aStack, bStack) {
  if (a === b) {
    // 针对某些平台`+0 !== -0`的情况
    return a !== 0 || 1 / a == 1 / b;
  }
  if (a == null || b == null) {
    // 其中一个为null或undefined时返回false
    return false;
  }
  if (typeof a != 'object' || typeof b != 'object') {
    // 排除基本类型后,其中一个不是引用类型,返回false
    return false;
  }
  var objToStr = Object.prototype.toString;
  var className = objToStr.call(a);
  if (className != objToStr.call(b)) {
    // 类型判断
    return false;
  }

  // 字符串、数值、日期对象、布尔类型、正则对象比较
  switch (className) {
    case '[object String]':
      return a == String(b);
    case '[object Number]':
      return isNaN(a) || isNaN(b) ? false : a == Number(b);
    case '[object Date]':
    case '[object Boolean]':
      return +a == +b;
    case '[object RegExp]':
      return a.source == b.source && a.global == b.global && a.multiline == b.multiline && a.ignoreCase == b.ignoreCase;
  }

  // 何种循环结构下触发???
  var length = aStack.length;
  while (length--) {
    if (aStack[length] == a) {
      return bStack[length] == b;
    }
  }

  // aStack、bStack将存入a、b及其子属性、子数组项,两者相等时删除该比较项
  aStack.push(a);
  bStack.push(b);

  var size = 0;

  // 数组类型比较
  if (className === '[object Array]') {
    size = a.length;

    // 长度不等
    if (size !== b.length) {
      return false;
    }
    // 深度比较数组项
    while (size--) {
      if (!eq(a[size], b[size], aStack, bStack)) {
        return false;
      }
    }
  } else {
    // 对象的构造函数不等
    if (a.constructor !== b.constructor) {
      return false;
    }

    // 通过对象的valueOf方法返回原始值比较
    if (a.hasOwnProperty('valueOf') && b.hasOwnProperty('valueOf')) {
      return a.valueOf() == b.valueOf();
    }

    // 对象属性个数是否匹配
    var keys = Object.keys(a);
    if (keys.length != Object.keys(b).length) {
      return false;
    }

    // 深度比较对象属性
    for (var i = 0; i < keys.length; i++) {
      if (!eq(a[keys[i]], b[keys[i]], aStack, bStack)) {
        return false;
      }
    }
  }
  aStack.pop();
  bStack.pop();
  return true;
}

module.exports = areEqual;

 

0
0
分享到:
评论

相关推荐

    从点体素角度看,并非所有体素都是相同的语义场景完成_Not All Voxels Are Equal Semantic Scen

    本文提出的“Not All Voxels Are Equal: Semantic Scene Completion from the Point-Voxel Perspective”针对这一挑战,提出了一种新颖的点-体素聚合网络。首先,通过移除可见的空体素将体素化的场景转换为点云,以...

    lsa新旧比较.rar

    If the sequence numbers are equal, then compare the checksums. The LSA with the highest unsigned checksum is the more recent. If the checksums are equal, then compare the age. If only one of the LSAs...

    Visual Studio 2010 TDD 测试驱动开发 实战 视频及源码

    Assert.AreEqual(strOK, result); string name = this.TestContext.DataRow["Name"].ToString(); string strOK = this.TestContext.DataRow["Value"].ToString(); HelloWord hello = new HelloWord(); string ...

    Mojitomarkuptest.zip

     A.areEqual('Mojito is working.', text, 'Rendered message &lt;em&gt;');  i = div.one('i');  A.isNotUndefined(i, '&lt;i&gt;');  A.isNotNull(i, '&lt;i&gt;');  text = i.getContent();  A.areEqual(spec....

    使用 Markdown 记录日志

    单元测试单元测试会测试特定行为并返回 PASS/FAIL 结果例如Assert.AreEqual(3, Math.Sqrt(9)); Assert.AreEqual(Double.NaN, Math.Sqrt(-1));单元测试很适合测试具有特定行为的单个方法和类。皮下集成测试皮下测试...

    NUnit软件测试快速入门

    在测试方法内部,我们创建了`Account`对象,模拟转账操作,并使用`Assert.AreEqual`方法进行断言,以确保转账后两个账户的余额正确。 完成代码编写后,需要编译生成`.dll`文件,然后使用NUnit GUI运行测试。打开...

    判断L1等于L2是否为真

    在上面的例子中,`areEqual`变量就是用来存储比较结果的布尔值,当所有元素都相等时,它的值为`true`,否则为`false`。 综上所述,"判断L1等于L2是否为真"的程序使用C++编写,可能利用了STL的`std::equal`函数或...

    ssd exercise1

    Two Advertisement objects are equal if their identification numbers are equal. operator&gt;&gt; This method reads an Advertisement object from an input stream. The advertisement should be input the ...

    C#_Soundex算法实现_代码_下载

    Assert.AreEqual("M530", Soundex("McDonald")); Assert.AreEqual("P236", Soundex("Peterson")); Assert.AreEqual("R530", Soundex("Robinson")); } } ``` 四、扩展与优化 在实际应用中,我们可以对算法进行...

    Nunit入门系列讲座6代码

    例如,`Assert.AreEqual`用于验证两个值是否相等,`Assert.Throws`则用于确认某个操作是否抛出了预期的异常。 从“Calculate”这个子文件名来看,这部分代码可能涉及一些计算逻辑,比如数学运算或者算法实现。在...

    问题解决(python)The first lock consists of a panel filled with spark

    diamondsrubies.emeraldsand so onBeside the panel is a row of buttonsone ...are equal numbers)then more than one button will need to be pressed.Your task is to write a function first lock(gems)...

    颜色空间转换RGB2HSI

    颜色空间转换RGB2HSI ... If all RGB component images are equal, the HSI conversion is undefined. The input image can be of class double (with values in the range [0, 1]), uint8, or uint16.

    计算机通信网阶段作业(一).docx

    Per-2~3 measurement, such as proceeds of c values are equal and equal to the design value, then the vertical installation accurate. For example a, b, and c valueswhile on horizontal vertical errors ...

    使用NUnit汇总

    在涉及到浮点数(float 和 double)的测试中,由于计算机表示浮点数的精度限制,直接使用 `Assert.AreEqual` 可能会导致误报。因此,应当使用带误差参数的版本,如 `Assert.AreEqual(expected, actual, tolerance[,...

    模拟测试框架NSubtitute.zip

    轻量级测试模拟(Mock)框架。提供非常友好的流畅性接口,让你几乎忘记框架的存在。是非常好的Rhino Mock的替代品。 示例代码: [TestMethod] ... Assert.AreEqual(3, actual); } 标签:NSubtitute

    NUnitExample

    NUnit提供了多种断言,如`Assert.AreEqual`、`Assert.IsNotNull`等。例如: ```csharp Assert.AreEqual(expectedValue, actualValue); Assert.IsNotNull(someObject); ``` 此外,NUnit还支持更复杂的测试特性,如...

    python 两个一样的字符串用==结果为false问题的解决

    print("The strings are not equal.") ``` 2. **手动检查并删除不可见字符**:如果知道字符串中可能存在的特定不可见字符类型,可以手动编写代码来删除这些字符。 ```python str1 = "hello\n" str2 = "hello...

    NUNIT简单操作

    // 此处期望值应为2,代码中误写为Assert.AreEqual(c, 2),实际c未定义,应更正为Assert.AreEqual(2, result); } } } ``` #### 第六步:运行测试 最后,通过单击Visual Studio中的运行按钮(通常是绿色的三角形...

Global site tag (gtag.js) - Google Analytics