数据类型练习题
需求:写一个函数,实现判断传入的两个数组是否相似
- 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
- 数组的长度一致。
- 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window。
思路:
首先判断传入的参数是否都为数组,如果有一个不是就返回false。在其次就是判断两个数组长度是否一致,且长度都不为0。定义两个新数组 arr3
arr4
,循环遍历 arr1
arr2
判断其每个元素的数据类型(这里选择 Object.prototype.toString.call(item)
原因是更具体,适应很多类型,如null
undefined
)并存入新数组3和4中,再接着遍历新数组 arr3
中元素,判断该元素在新数组 arr4
中是否存在,如若存在就删除新数组 arr4
中对应的元素。最后判断新数组 arr4
的数组长度,为 0 返回 true 说明两数组相似,不为 0 返回 false ,说明两数组不相似。
代码:
function arraysSimilar(arr1, arr2){
if(Array.isArray(arr1)===false||Array.isArray(arr2)===false){
return false //判断两个参数是否都为数组
}else if(arr1.length===arr2.length&&arr1.length!==0){//判断两数组长度是否相同
//使用Object.prototype.toString.call(item)方法判断数据类型
var arr3=arr1.map(function(item){return Object.prototype.toString.call(item)})
var arr4=arr2.map(function(item){return Object.prototype.toString.call(item)})
for(var i=0;i<arr3.length;i++){
//外侧循环arr3(控制判断轮数),内侧循环arr4(控制判断次数)
for(var j=0;j<arr4.length;j++){
if(arr3[i]===arr4[j]){
arr4.splice(j,1)//数组的splice()方法;索引,操作个数
}
}
}
if(arr4.length===0){return true}
else{return false}
}
}
判断数据类型方式的选择
typeof:适合基本类型和 function
的检测,遇到null失效( typeof(null)
返回 Object
)
[[Class]]:通过 {}.toString
得到,适合内置对象和基本类型,遇到null和undefined失效(IE678返回 [[onject Object]]
)
instanceof:适合自定义对象,也可以用来检测原生对象,判断其是否属于某种类型,在不同iframe和window间检测时失效
Object.prototype.toString.call(item):属于全能类型
网友评论