028 shallowequal

028 shallowequal

用途

对象浅对比相等

比较两个对象的键是否相等,两个对象的每一个键对应的属性,是否全等

适合于两个对象的属性都是简单类型的情况,或者复杂类型,指向一个内存地址的情况

可靠性

150 星星,50万人使用

官网链接

https://github.com/dashed/shallowequal

https://www.npmjs.com/package/shallowequal

基本使用

const shallowequal = require("shallowequal");

const object = { user: "fred" };
const other = { user: "fred" };

object == other;
// → false

shallowequal(object, other);
// → true

源码

module.exports = function shallowEqual(objA, objB, compare, compareContext) {

  // 如果用户自定义了比较函数 compare,直接使用并返回
  var ret = compare ? compare.call(compareContext, objA, objB) : void 0;

  if (ret !== void 0) {
    return !!ret;
  }

  // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/is]
  // 比较两个值是否相等,简单类型相等,或者复杂类型(对象)内存相等
  if (Object.is(objA, objB)) {
    return true;
  }

  // 如果不是对象,不等于
  if (typeof objA !== "object" || !objA || typeof objB !== "object" || !objB) {
    return false;
  }

  // 获取对象的键数组
  var keysA = Object.keys(objA);
  var keysB = Object.keys(objB);

  // 先比较键的长度
  if (keysA.length !== keysB.length) {
    return false;
  }

  var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);

  // Test for A's keys different from B.
  // 判断两个对象的每一个键值对是否相等
  for (var idx = 0; idx < keysA.length; idx++) {
    var key = keysA[idx];

    if (!bHasOwnProperty(key)) {
      return false;
    }

    var valueA = objA[key];
    var valueB = objB[key];

    ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;

    if (ret === false || (ret === void 0 && !Object.is(valueA, valueB))) {
      return false;
    }
  }

  return true;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值