在JavaScript中,二维数组本质上是一种特殊目标,它种类会回到 object
。
假如我们应该较为两个数组是不是相同,不能像较为基本类型(String、Number、Boolean等)一样,应用 ===
(或 ==
) 来判定,因此如果想较为二维数组是不是相同,需要使用一些特殊方式。有关JS种类的分析,由此可见博闻 typeof应用详细说明。
文中汇总了几种二维数组对比的手法,方便我们遇到类似情况时可以快速解决。
- 循环系统较为
- toString方式
- join方式
- JSON.stringify
必须表述的,这儿仅针对数组元素为原始类型(String、Number、Boolean)的现象。
假如数据元素是繁杂种类,如Object、Function这些,将无法根据这个方法进行简单比较了,必须再行特别处理。并且当存有这种繁杂种类时,较为二维数组是不是相同早已没什么意义,这篇文章不去做探讨。
那也是有关二维数组的第四篇博闻,前边三篇如下所示:
学习培训JavaScript二维数组,从一些独特的地方逐渐
JavaScript二维数组里的类数组对象
循环系统较为
应用周而复始的方式一一较为数组元素数值,很有可能就是我们最开始想得到的方法。
循环系统较为大约可分两种方法,一种是应用 for
、while
等for语句,较为简单,如下所示编码所显示:
const arr1 = [1, 2, 3], arr2 = [1, 2, 3]
// 必须分辨2个数组长度
arr1.length === arr2.length
// 一一较为原素值,有一个不相同就不一
for (let i = 0; i < arr1.length; i ) {
if (arr2[i] !== arr2[i]) {
return false
}
}
另外一种就是使用二维数组的循环类实例方法,如 foreach
、map
等工艺二维数组周而复始的实例方法,与使用 for
句子较相近,同样可以达成目的。
而采用 every
、some
、filter
等这种实例方法,则代码编写上面更简单一些,如下所示:
const arr1 = [1, 2, 3], arr2 = [1, 2, 3]
// 应用every
arr1.length === arr2.length && arr1.every((v,i) => v === arr2[i])
// 应用some
arr1.length === arr2.length && !arr1.some((v, i) => v !== arr2[i])
// 应用filter
arr1.length === arr2.length && arr1.filter((v, i) => v !== arr2[i]).length === 0
// 应用find和findIndex
arr1.length === arr2.length && arr1.findIndex((v, i) => v !== arr2[i]) === -1
在我们开展循环系统有关的较为时,都采用的是严苛相同
===
,首先会分辨种类是不是相同。
那如果必须忽视元素类型时,可以用==
,那样,就会自动对数组元素开展数据转换之后再较为,如true == 1
会创立。
toString
toString
方法是什么Object种类对象实例方法,而JS中Object是绝大多数类别的父类,因此多种类型都可以启用此方法。(null和undefined除外,并没有实例方法。)
toString方式作用是回到一个对象的字符串数组方式,这儿,大家用它返回数组的字符串数组方式的信息。
[1,2,3].toString() // '1,2,3'
之上编码,便是返回数组 [1,2,3]
的字符串数组方式,以分号分到物质组成字符串数组数据信息,返回 '1,2,3'
。
假如数组元素是繁杂种类,如Object目标,则toString返回结论将不同:
[1,2,{}].toString() // '1,2,[object Object]'
这儿toString方式对 {}
立即返回是 [object Object]
。
基于此,大家较为数组元素为原始类型的二维数组时,能够如下所示那样应用:
[1,2,3].toString() === [1, 2, 3].toString() // true
需注意,假如数组元素为数的字符串数组方式,结论也是一样的:
['1', 2, 3].toString() // '1,2,3'
[1,2,3].toString() === ['1', 2, 3].toString() // true
join
join
方法是什么二维数组的一个实例方法。
它有一个可选参数,可作为分节符,以这个分节符隔开全部数组元素构成字符串数组数据信息回到,假如不加主要参数,默认设置要以分号切分。
根据join方式用法,大家就可以知道,假如不给予分节符的参数,它对于二维数组所起到的作用看起来和 toString
方式几乎一样。
[1,2,3].join() === [1, 2, 3].join() // true
[1,2,3].join() === ['1', '2', '3'].join() //true
自然,也可以添加分节符,实际效果是一样的,如使用空字符:
[1,2,3].join('') // '123'
[1,2,3].join('') === ['1', '2', '3'].join('') //true
从上得知,即然join没有参数和toString方式几乎一样,那他们互相之间得比较,本质上都是二维数组转化成逗号分隔的字符串数组,所以是相等:
[1, '2', true].join() === [1, '2', true].toString() // true
[1, '2', true].toString() === [1, '2', true].join() // true
JSON.stringify
JSON.stringify
用以将一个对象或值转化成JSON字符串数组,假如是二维数组,一般会如此变换:
JSON.stringify([1, '2', true]) // '[1,"2",true]'
利用这个特性,大家就可以通过它开展二维数组的常规较为:
[1, 2, 3] === [1, 2, 3] // false
JSON.stringify([1, 2, 3]) === JSON.stringify([1, 2, 3]) // true
JSON.stringify([1, '2', true]) === JSON.stringify([1, '2', true]) // true
需注意,JSON.stringify解决字符串数组是变换结论会有引号:
JSON.stringify(['1']) // '["1"]'
JSON.stringify(['1']) === '["1"]' // true
JSON.stringify(['1']) === '[\'1\']' // false
有关JSON.stringify方式新的知识,可以查看博闻JSON.parse 和 JSON.stringify 详细说明
当数组元素是空原素、null、undefined时
之上推荐的数组元素的种类全是原始类型(String、Number、Boolean),但数组元素也可以是此外三种突发情况:空原素
、null
、undefined
,接下来将简单介绍下发生这三种情况时的较为方法。
null 和 undefined
当使用 JSON.stringify
方式时,空原素、null、undefined这三种类型元素都能被转化成 null
字符串数组值,能够很好的分辨:
JSON.stringify([1, '2', true, , null, undefined]) // '[1,"2",true,null,null,null]'
JSON.stringify([1, '2', true, , null, undefined]) === JSON.stringify([1, '2', true, , null, undefined]) // true
toString
和 join
方式较相近,他会把这三种类型数值都转化成空字符:
[1, '2', true, , null, undefined].join() // '1,2,true,,,'
[1, '2', true, , null, undefined].toString() // '1,2,true,,,'
[1, '2', true, , null, undefined].toString() === [1, '2', true, , null, undefined].join() // true
在我们应用上边推荐的第一种循环系统数组元素方法进行较为时,null和undefined只应注意他们两类数值是不是相同:
null == undefined // true
null === undefined // false
应用严苛相同较为时,这两类不相同。
空原素
数组元素是空原素时,应用循环系统方法解决,则会有一些不一样,关键和二维数组的空元素特性相关:
- 二维数组根据字符载入空原素时,回到undefined。
- 当使用
for
、while
、for-of
、find
、findIndex
等词法时,空原素会回到undefined
值;undefined值会被较为,所以这个时候开展数组元素较为时,结论正确。 - 当使用二维数组实例方法循环系统如
forEach
、map
、every
、some
、filter
等方式时,空原素能被绕过;因为值被绕过,使用这种形式进行数组元素较为时,结论很有可能是不正确的。
const arr1 = [1, 2, , 3], arr2 = [1, 2, 2, 3]
arr1.length === arr2.length && arr1.every((v, i) => v === arr2[i]) // true
arr1.length === arr2.length && arr1.filter((v, i) => v !== arr2[i]).length === 0 // true
arr1.length === arr2.length && !!arr1.find((v, i) => v !== arr2[i]) // false
arr1.length === arr2.length && arr1.findIndex((v, i) => v !== arr2[i]) === -1 // false
之上编码,二维数组arr1有一个空原素,与二维数组arr2元素并不相同,但我们应用 every
和 filter
较为获得数值为 true
,这明显是不正确的;而采用 find
和 findIndex
较为结果显示 false
,正确。
汇总
之上四类二维数组较为的形式,根据我测试结论,速度上,循环系统方法里的 for
词法是速度最快的,并且此方式还可以恰当较为空原素、null、undefined三种突发情况,综合性来看应用for循环是最好的选择。
第一种循环系统类方法,性能表现总体好于此外三种方式。
join方式比toString方法更用时。
假如信息量并不是很大,这几点方法用时很有可能都是在0.1ms之内,基本上可以忽略不计。
最终,大家总结一下本篇文章,主要介绍了四种可以较为基本二维数组(二维数组为原始记录种类)是不是相等四种方法。也详细介绍了当数组元素是此外三种突发情况(空原素、null、undefined)时,上边推荐的四种较为方法是否有效。自然,假如数组元素是复杂数据类型如Object、Function等均较为没有意义,没有在文中探讨范围之内。