function isEqual(obj1, obj2) {
if ((typeof (obj1) !== "object" && obj1 !== null) || (typeof (obj2) !== "object" && obj2 !== null)) {
return obj1 === obj2
if (obj1 === obj2) {
return true
let obj1key = Object.keys(obj1)
let obj2key = Object.keys(obj2)
if (obj1key.length !== obj2key.length) {
return false
for (key in obj1) {
if (!isEqual(obj1[key], obj2[key])) {
return false
return true
function isEqual(obj1, obj2) { // 先判断这俩是不是对象或者数组类型的 if (typeof (obj1) !== "object" && obj1 !== null && typeof (obj2) !== "object" && obj2 !== null) { return obj1 === obj2 } // 如果特意传的就是两个指向同一地址的对象 i.
// 实现效果
let a = { name: 'zfb', age: 18, major: { main: 'math', other: 'chinese'} }
let b = { name: 'zfb', age: 18, major: { main: 'math', other: 'chinese'} }
console.log(a === b) // false
正常情况下,两个对象是不可能相等的,虽然 键 和 值 一样,因为他们有着不同的内存指向,实现 isEqual 函数
var re.
观察者需要放到被观察者中,被观察者的状态变化需要通知观察者 我变化了 内部也是基于发布订阅模式,收集观察者,状态变化后要主动通知观察者
实现一个链表结构
链表结构看图理解next层级
参考前端手写面试题详细解答第一版 时间复杂度为 O(n^2)
第二版 标记法 / 自定义属性法 时间
此篇包括但不仅限于对前一篇博客知识点的补充
1.手写深度比较,模拟lodash isEqual
关于深度比较的理解:如果obj1和obj2的属性、值全部相等,但是令他们 = = =的时候,还是返回false,因为他们的地址不同,深度比较就是能对两个地址不同,值相同的对象进行比较,返回true。
function isObject(obj){
return typeof obj === 'object' && obj !== null;
function isEqual(o
function isEqual(obj1, obj2) {
if (!isObject(obj1) || !isObject(obj2)) {
// 值类型(注意,参与 equal 的一般不会是函数)
return obj1 === obj2
使用lodash比较两个json数组的差异在使用jqgrid的本地数据模式时,需要实现本地数据的增删改功能,保存数据时就需要对原始的json数组和最新的json数组作比较,此时可以使用lodash.js的比较方法。注意:引用lodash时,需要引用lodash.js,不能引用lodash.core.js,因为后者不包含本文中所使用的方法具体方法如下:
假如object包含两个属性,varName和
什么是深度比较
lodash.isEqual : 比较对象的键值对,都一样则为true,反之false;
其中,若对象的属性值是引用类型,比较的是实际值不是地址(当然,若地址是一样的,那么肯定相等,return true);
默认不会比较函数
1.不是对象,直接返回比较结果,return ===
2. 地址相等的对象 return true
3. 两个都是对象||数组
(1)比较两对象keys的个数
(2)以obj1的key为基准,和obj2依次递归比较
function isEqual (