手写深度比较isEqual,模拟loadsh isEqual

205 阅读2分钟

1.手写isEqual

/**
 * @method isObject 
 * @description 判断是否是对象或者数组
 * @param obj
 */
const isObject = (obj) => {
    return typeof obj === "object" && obj !== null
}

/**
 * @method isEqual
 * @description 判断俩个数组或者对象是否全相等 
 */
const isEqual = (obj1, obj2) => {
    // 判断obj1或者obj2 只要有一个不是对象或者数组
    if (!isObject(obj1) || !isObject(obj2)) {
        // 值类型 (!!! 参与equal的不会是函数)
        return obj1 === obj2
    }
    if (obj1 === obj2) {
        return true
    }
    /**
     * @description 俩个都是数组或者对象,而且不相等
     * 1. 先取出obj1,obj2的keys,比较个数  
     * 2. Object.keys返回的key是放到数组中的 
     * 3. 数组是以索引为key
     * 4. 对象是以属性为key
     * 5. 判断俩个对象的keys长度
     */
    const obj1Keys = Object.keys(obj1)
    const obj2Keys = Object.keys(obj2)
    if (obj1Keys.length !== obj2Keys.length) {
        return false
    }
    /**
     * 以obj1 为基准,和obj2 依次递归比较
     */
    for (let key in obj1) {
        // 比较当前key的value
        const res = isEqual(obj1[key], obj2[key])
        if (!res) {
            return false
        }
    }
    /**
     * 全部相等
     */
    return true
}
const obj1 = {
    a: 200,
    b: {
        x: 100,
        y: 200
    }
}
const obj2 = {
    a: 100,
    b: {
        x: 100,
        y: 200
    }
}
console.log(isEqual(obj1, obj2));

2.split()和join的区别

1.split() 传入指定字符进行分割 返回一个数组
      const str = 'a-b-c-d-e-f'.split('-')
      console.log(str); // [a,b,c,d,e,f]
2.join()  传入指定字符串进行拼为字符串
      const str1 = [a,b,c,d,e,f].join('-')
      console.log(str1); // 'a-b-c-d-e-f'

pop push unshift shift 分别是什么?

1.pop
    const popResult= arr.pop()  // 返回删除数组的最后异一项
    console.log(popResult, arr); // f  [ 'a', 'b', 'c', 'd', 'e' ]
    
2.shift
    const shiftResult = arr.shift()      // 返回删除数组的第一项
    console.log(shiftResult, arr);       // a ['b', 'c','d', 'e', 'f']
    
3.push
    const pushResult = arr.push('g')        // 返回length数组长度
    console.log(pushResult, arr);           // 7  ['a', 'b', 'c','d', 'e', 'f','g']
    
4.unshift
    const unShiftResult = arr.unshift('x')  // 返回 数组长度length
    onsole.log(unShiftResult, arr);         // 7  ['x', 'a', 'b', 'c','d', 'e', 'f']

数组的API, 有哪些是纯函数

  • 纯函数:
  • 1.不改变原数组(没有副作用)
  • 2.返回一个数组
  • 非纯函数
  • push pop shift unshift
  • forEach
  • some every
  • reduce
1.concat  拼接,追加
    const arr1 = arr.concat([10,11,12])
    console.log(arr);  // [1,2,3,4,5,6,7,8,9]
    console.log(arr1);  // [1,2,3,4,5,6,7,8,9,10,11,12]
    
2.map 循环
    const arr2 = arr.map(item => item * 10)
    console.log(arr);  // [1,2,3,4,5,6,7,8,9]
    console.log(arr2);  // [10, 20, 30, 40, 50, 60, 70, 80, 90]

3.filter  过滤
    const arr3 = arr.filter(item => item > 3)
    console.log(arr);  // [1,2,3,4,5,6,7,8,9]
    console.log(arr3);  // [ 4, 5, 6, 7, 8, 9 ]
    
4.slice  复制
    const arr4 = arr.slice()
    console.log(arr);  // [1,2,3,4,5,6,7,8,9]
    console.log(arr4);  // [1,2,3,4,5,6,7,8,9]  有点像是复制和深拷贝,但不是严格意义上的