[] === [] // false
因为数组是引用类型,比较的是内存中的地址位- 因此这里判断的是,数组的值是否相等
- 注意数组中也会嵌套数组
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)
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。