1. [] === [] // false
    因为数组是引用类型,比较的是内存中的地址位
  2. 因此这里判断的是,数组的值是否相等
  3. 注意数组中也会嵌套数组

eg:输入a1=[1],a2=['1']
输出false

输入a1=[1,2],a2=[1,[2]]
输出false

输入a1=[1,2,3,4],a2=[1,2,3,4]
输出true

输入a1=['a',['b',['c']],'d'],a2=['a',['b',['c']],'d']
输出true

Array.prototype.equals = function(arr) {
    if (!arr) {
        return false
    }
    if (this.length != arr.length) {
        return false
    }
    for (let i = 0; i < this.length; i++) {
        // 数组里面嵌套了数组,递归
        if (Array.isArray(this[i]) && Array.isArray(arr[i])) {
            if (!this[i].equals(arr[i])) {
                return false
            }
        } else {
            if (this[i] !== arr[i]) {
                return false
            }
        }
    }
    return true
}

let a1 = ['a', ['b', ['c']], 'd']
let a2 = ['a', ['b', ['c']], 'd']
console.log(a1.equals(a2))

优化:for in 不仅返回的是数组的下标,而且将数组的原型对象以及数组对象本身属性值都会返回。但是这也存在一个问题,在实际工作开发中,这些对象很可能是不需要的,全部列举出来可能会产生新的问题。

let a1 = [1, 2, 3]
for (let i in a1) {
    console.log(i)
}
// 输出
> 0
> 1
> 2
> equals

解决方法,使用defineProperty将equals设置为不可枚举

Object.defineProperty(Array.prototype, 'equals', { 
    enumerable: false 
})
let a1 = [1, 2, 3]
for (let i in a1) {
    console.log(i)
}

corn6
4 声望0 粉丝

寻找自我Corn6