isEqual

isEqual

手写深度比较,模拟loadash is Equal

split()和join()的区别

数组的pop push unshift shift分别做什么

手写深度比较lodash.isEqual

实现如下效果
const obj1={a:10,b:{x:100,y:200}}
const obj2={a:10,b:{x:100,y:200}}
isEqual(obj1,obj2)===true

代码演示

//判断是否对象或者数组
function isObject(obj){
    return typeof obj === 'object' && obj!==null
}
//全相等
function isEqual(obj1,obj2){
    if(!isObject(obj1)||isObject(obj2)){
        //值类型,注意,参与equal一般不会是函数
        return obj1 === obj2
    }
    if(obj1===obj2){
        return true
    }
    //两个都是对象或者数组并且不相同
    //1.先取出obj和obj2的keys,比较个数
    const obj1Keys = Object.keys(obj1)
    const obj2Keys = Object.keys(obj2)
    if(obj1Keys.length ! == obj2Keys.length){
        return false
    }//以obj1为基准,和obj2依次递归比较
    for(for key in obj1){
        //比较当前key的value 递归
        const res = isEqual(obj1[key],obj2[key])
        if(!res){
          return false
        }
    }
    //全相等
    return true
}

isEqual.js

const obj1={
    a:100,
    b:{
        x:100,
        y:200
    }
}

const obj2={
    a:100,
    b:{
        x:100,
        y:200
    }
}

//console.log(obj1 === obj2)//false
console.log(isEqual(obj1,obj2)//false

split()和join()的区别

'1-2-3'.split('-')//[1,2,3]
[1,2,3].join('-')//'1-2-3'

数组的pop push unshift shift分别做什么

功能是什么?
返回值是什么?
是否会对原数组造成影响

代码演示

arry-api.js

const arr =[10,20,30,40]
//pop
const popRes = arr.pop()
console.log(popRes,arr)//40 [10,20,30]
// push
const pushRes = arr.push(50)//追加一个50,返回一个length
console.log(pushRes,arr)//[10,20,30,40,50]

//unshift
const unshiftRes = arr.unshift(5)
console.log(unshiftRes,arr)// [5,10,20,30,40]

//shift
const shiftRes = arr.shift()//10
console.log(shiftRes,arr)//10 [20,30,40]

[扩展]数组的API,有哪些是纯函数
1.不改变源数组(没有副作用)2返回一个数组
//concat
const arr1 = arr.concat([50,60,70])
// map
const arr2 = arr.map(num=>num*10)
//filter
const arr3 = arr.filter(num=>num>35)
//slice
const arr4 = arr.slice()//类似一个深拷贝

非纯函数 push pop shift unshift forEach