对象是否相等

阅读次数:29 次  |  发布时间:2020-08-03T08:28:27Z 

//如果用JSON.stringify转化属性顺序不同,也不相等;
//而且不支持无法对函数 、RegExp等特殊对象的克隆

function deepCompare(x, y) {
	var i, l, leftChain, rightChain;

	function compare2Objects(x, y) {
		var p;

		// remember that NaN === NaN returns false
		// and isNaN(undefined) returns true
		if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {
			return true;
		}

		// Compare primitives and functions.     
		// Check if both arguments link to the same object.
		// Especially useful on the step where we compare prototypes
		if (x === y) {
			return true;
		}

		// Works in case when functions are created in constructor.
		// Comparing dates is a common scenario. Another built-ins?
		// We can even handle functions passed across iframes
		if ((typeof x === 'function' && typeof y === 'function') || (x instanceof Date && y instanceof Date) || (x instanceof RegExp && y instanceof RegExp) || (x instanceof String && y instanceof String) || (x instanceof Number && y instanceof Number)) {
			return x.toString() === y.toString();
		}

		// At last checking prototypes as good as we can
		if (!(x instanceof Object && y instanceof Object)) {
			return false;
		}

		if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
			return false;
		}

		if (x.constructor !== y.constructor) {
			return false;
		}

		if (x.prototype !== y.prototype) {
			return false;
		}

		// Check for infinitive linking loops
		if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
			return false;
		}

		// Quick checking of one object being a subset of another.
		// todo: cache the structure of arguments[0] for performance
		for (p in y) {
			if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
				return false;
			} else if (typeof y[p] !== typeof x[p]) {
				return false;
			}
		}

		for (p in x) {
			if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
				return false;
			} else if (typeof y[p] !== typeof x[p]) {
				return false;
			}

			switch (typeof(x[p])) {
			case 'object':
			case 'function':

				leftChain.push(x);
				rightChain.push(y);

				if (!compare2Objects(x[p], y[p])) {
					return false;
				}

				leftChain.pop();
				rightChain.pop();
				break;

			default:
				if (x[p] !== y[p]) {
					return false;
				}
				break;
			}
		}

		return true;
	}

	if (arguments.length < 1) {
		return true;
	}

	for (i = 1, l = arguments.length; i < l; i++) {

		leftChain = []; //Todo: this can be cached
		rightChain = [];

		if (!compare2Objects(arguments[0], arguments[i])) {
			return false;
		}
	}

	return true;
}

const obj1 = {
	name: '张三',
	age: 23,
	obj: {
		name: '李四',
		age: 46
	},
	arr: [1, 2, 3],
	date: new Date(23),
	reg: new RegExp('abc'),
	fun: () = > {}
}
const obj2 = {
	name: '张三',
	age: 23,
	obj: {
		name: '李四',
		age: 46
	},
	arr: [1, 2, 3],
	date: new Date(23),
	reg: new RegExp('abc'),
	fun: () = > {}
}
console.log(deepCompare(obj1, obj2)) // true

最近发布的代码:

JavaScript生成随机码 JavaScript 程序  |  32次阅读  | 发布于:2020-08-11T07:07:50Z
switch 简写 JavaScript 程序  |  29次阅读  | 发布于:2020-08-03T23:01:51Z
短路运算 - & JavaScript 程序  |  34次阅读  | 发布于:2020-08-03T23:01:34Z
短路运算 - ||(或) JavaScript 程序  |  33次阅读  | 发布于:2020-08-03T23:01:21Z
使用Boolean过滤数组假值 JavaScript 程序  |  29次阅读  | 发布于:2020-08-03T23:01:06Z
JavaScript动态判断数据类型 JavaScript 程序  |  32次阅读  | 发布于:2020-08-03T23:00:51Z
JavaScript奇偶数判断 JavaScript 程序  |  32次阅读  | 发布于:2020-08-03T23:00:09Z
JavaScript数字取整 JavaScript 程序  |  35次阅读  | 发布于:2020-08-03T22:59:49Z
双位运算符 JavaScript 程序  |  32次阅读  | 发布于:2020-08-03T22:59:19Z
判断小数是否相等 JavaScript 程序  |  36次阅读  | 发布于:2020-08-03T22:58:36Z
字符串转数字 - 使用 + 操作符 JavaScript 程序  |  30次阅读  | 发布于:2020-08-03T22:58:03Z
字符串转数字 - 用*1来转化为数字,实际上是调用.valueOf方法 JavaScript 程序  |  33次阅读  | 发布于:2020-08-03T22:57:17Z
Number的数字千分位格式化 JavaScript 程序  |  39次阅读  | 发布于:2020-08-03T22:56:51Z
转化为字符串 JavaScript 程序  |  33次阅读  | 发布于:2020-08-03T22:55:24Z
url参数反序列化 JavaScript 程序  |  38次阅读  | 发布于:2020-08-03T22:55:12Z
url参数序列化 JavaScript 程序  |  35次阅读  | 发布于:2020-08-03T22:54:44Z
字符串翻转 JavaScript 程序  |  33次阅读  | 发布于:2020-08-03T22:53:00Z
函数异步执行 - Async/Await JavaScript 程序  |  41次阅读  | 发布于:2020-08-03T22:52:40Z
函数异步执行 - Generator JavaScript 程序  |  36次阅读  | 发布于:2020-08-03T22:52:14Z
函数异步执行 - Promise JavaScript 程序  |  33次阅读  | 发布于:2020-08-03T22:51:44Z
函数自执行 JavaScript 程序  |  29次阅读  | 发布于:2020-08-03T22:50:53Z
函数隐式返回值 JavaScript 程序  |  36次阅读  | 发布于:2020-08-03T22:50:06Z
JavaScript对象转化为字符串 JavaScript 程序  |  34次阅读  | 发布于:2020-08-03T22:49:15Z
对象是否相等 JavaScript 程序  |  29次阅读  | 发布于:2020-08-03T08:28:27Z
对象深度拷贝 JavaScript 程序  |  32次阅读  | 发布于:2020-08-03T08:26:50Z
拦截对象 JavaScript 程序  |  30次阅读  | 发布于:2020-08-03T08:26:23Z
拦截对象 JavaScript 程序  |  30次阅读  | 发布于:2020-08-03T08:25:50Z
解构对象属性默认值 JavaScript 程序  |  30次阅读  | 发布于:2020-08-03T08:25:31Z
解构对象属性别名 JavaScript 程序  |  32次阅读  | 发布于:2020-08-03T08:25:21Z
对象嵌套属性解构 JavaScript 程序  |  32次阅读  | 发布于:2020-08-03T08:25:11Z

最多阅读的代码

 getAttribute和getAttributeNode JavaScript 程序  |  1542次阅读
 一种很帅的JS代码书写方式 JavaScript 程序  |  1269次阅读
 Chrome 滚动条冻结现象 JavaScript 程序  |  1244次阅读
 Web弹出类似Android的Toast的信息提示 JavaScript 程序  |  1200次阅读
 通过jQuery发送ajax请求 JavaScript 程序  |  1108次阅读
 js为object动态添加属性 JavaScript 程序  |  1045次阅读
 [小Tip]Webkit下设置hash的一个坑 JavaScript 程序  |  953次阅读
 AMD 的 CommonJS wrapping JavaScript 程序  |  896次阅读
 用Opera Mobile调试手机版网页 JavaScript 程序  |  750次阅读
 在自己的网页中嵌入百度搜索框 JavaScript 程序  |  623次阅读
 Javascript八进制转义字符转中文 JavaScript 程序  |  548次阅读
 jQuery获取Select选择的Text和Value JavaScript 程序  |  528次阅读
 处理字符串的常见操作之截取:substring JavaScript 程序  |  370次阅读
 JavaScript跨平台(兼容各个平台)事件 JavaScript 程序  |  366次阅读
 用JavaScript添加style节点 JavaScript 程序  |  361次阅读
 把一个Array追加到另一个Array上 JavaScript 程序  |  352次阅读
 JavaScript字符与ASCII码间的转换 JavaScript 程序  |  351次阅读
 如何跳出双重循环 JavaScript 程序  |  345次阅读
 jquery判断两次点击对象是否是同一对象 JavaScript 程序  |  344次阅读
 Array迭代器 JavaScript 程序  |  341次阅读
 用jQuery把页面上的一个tag换成另一个tag JavaScript 程序  |  340次阅读
 合并两个Array并去掉重复项 JavaScript 程序  |  329次阅读
 JavaScript删除数组中的项 delete vs splice JavaScript 程序  |  327次阅读
 JavaScript中克隆对象 JavaScript 程序  |  315次阅读
 JavaScript判断浏览器类型及主版本 JavaScript 程序  |  312次阅读
 JavaScript中base64编码 JavaScript 程序  |  311次阅读
 检查一个object是否是jQuery object JavaScript 程序  |  307次阅读
 判断一个对象是否为数组 JavaScript 程序  |  296次阅读
 通过原型继承创建一个新对象 JavaScript 程序  |  296次阅读
 检查一个数是否为整数或浮点数 JavaScript 程序  |  276次阅读