比较两个对象是否彻底同样;具体思路以下: spa
1. 先判断2个对象的数据类型是否一致。prototype
2. 若是对象的数据是基础的数据类型; 直接比较; 若是是 Number, 对NaN进行特殊处理。code
3. 若是对象的数据类型是 Array; 对象进行循环, 逐值进行判断。对象
4. 若是对象的数据类型是 Object; 分别对象的key, value 进行判断。blog
5. 若是对象的数据类型是 Map 或者 Set; 转化为Array进行判断。get
具体代码以下string
/** * * 返回对相应的数据类型 */ function getType(data) { return Object.prototype.toString.call(data).substring(8).split(/]/)[0] } /** * * @param {*} sourceObj * @param {*} compareObj * * 比较对象是否相等 * */ function comparisonObject(sourceObj, compareObj) { if (arguments.length < 2) throw "Incorrect number of parameters"; let sourceType = getType(sourceObj); if (sourceType !== getType(compareObj)) return false; // Not objects and arrays if (sourceType !== "Array" && sourceType !== "Object" && sourceType !== "Set" && sourceType !== "Map") { if (sourceType === "Number" && sourceObj.toString() === "NaN") { return compareObj.toString() === "NaN" } if (sourceType === "Date" || sourceType === "RegExp") { return sourceObj.toString() === compareObj.toString() } return sourceObj === compareObj } else if (sourceType === "Array") { if (sourceObj.length !== compareObj.length) return false; if (sourceObj.length === 0) return true; for (let i = 0; i < sourceObj.length; i++) { if (!comparisonObject(sourceObj[i], compareObj[i])) return false; } } else if (sourceType === "Object") { let sourceKeyList = Reflect.ownKeys(sourceObj); let compareKeyList = Reflect.ownKeys(compareObj); let key; if (sourceKeyList.length !== compareKeyList.length) return false; for (let i = 0; i < sourceKeyList.length; i++) { key = sourceKeyList[i]; if (key !== compareKeyList[i]) return false; if (!comparisonObject(sourceObj[key], compareObj[key])) return false; } } else if (sourceType === "Set" || sourceType === "Map") { // 把 Set Map 转为 Array if (!comparisonObject(Array.from(sourceObj), Array.from(compareObj))) return false; } return true; }