**任务
请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:
1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
2. 数组的长度一致。
3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.**
思路:
1.先判断两个数组是不是数组类型
2.再判断两个数组的长度是不是一致
3.建一个类型对象数组obj,初始化为零。
var obj={
'number':0,
'string':0,
'boolean':0,
'undefined':0,
'null':0,
'function':0,
'date':0,
'object':0,
'window':0
};
4.第一个数组arr1,遍历,遇到一个元素,把相应的类型在obj中加一
5.第二个数组arr2,遍历,遇到一个元素,把相应的类型在obj中减一
6.最后判断是不是obj里面所有键都值为0。
function check(i){
//除了function 其他的引用类型用instanceof来判定
if(i instanceof Date){
return 'date';
}
else if(i instanceof Window){
return 'window';
}
// typeof可以判断基本类型(number string boolean null(typeof 返回object) undefined )和引用类型的function类型
if(typeof i === 'number')return 'number';
else if(typeof i === 'string')return 'string';
else if(typeof i === 'boolean')return 'boolean';
else if(typeof i === 'function')return 'function';
//typeof null 返回 object
else if(typeof i === 'object'){
if(i === null){
return 'null';
}else{
return 'object';
}
}
else if(typeof i === 'undefined'){
return 'undefined';
}
}
function arraysSimilar(arr1, arr2){
if(!arr1||!arr2){return false;}
if(!(arr1 instanceof Array )||!(arr2 instanceof Array))return false;
if(arr1.length!=arr2.length)return false;
var obj={
'number':0,
'string':0,
'boolean':0,
'undefined':0,
'null':0,
'function':0,
'date':0,
'object':0,
'window':0
};
for(var i=0;i<arr1.length;i++){
var r1=check(arr1[i]);
var r2=check(arr2[i]);
obj[r1]++;
obj[r2]--;
}
for(var o in obj){
if(obj[o]!=0)return false;
}
return true;
}
测试用例:
var cases=[{
arr1:[1,true,null],
arr2:[null,false,100],
expect:true
},{
arr1:[function(){},100],
arr2:[100,{}],
expect:false
},{
arr1:[null,999],
arr2:[{},444],
expect:false
},{
arr1:[window,1,true,new Date(),"hahaha",(function(){}),undefined],
arr2:[undefined,(function(){}),"okokok",new Date(),false,2,window],
expect:true
},{
arr1:[new Date()],
arr2:[{}],
expect:false
},{
arr1:[window],
arr2:[{}],
expect:false
},{
arr1:[undefined,1],
arr2:[null,2],
expect:false
},{
arr1:[new Object,new Object,new Object],
arr2:[{},{},null],
expect:false
},{
arr1:null,
arr2:null,
expect:false
},{
arr1:[],
arr2:undefined,
expect:false
},{
arr1:"abc",
arr2:"cba",
expect:false
}];
for(var i=0;i<cases.length;i++) {
console.log(cases[i].arr1,cases[i].arr2);
console.log(arraysSimilar(cases[i].arr1, cases[i].arr2));
console.log(cases[i].expect);
}
除了instanceof和typeof,用Object.prototype.toString.call(obj)和duck type(就是看有没有这个类型的固有属性,比如要判断数组,就看有没有arr.map等)来判定。