Javascript类型判断相关例题及解析
题目:
请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:
1.数组中的成员类型相同,顺序可以不同。例如[1,true]与[false,2]是相似的。
2.数组的长度一致。
3.类型的判断范围,需要区分:String,Boolean,Number,undefined,null,函数,日期,window.
当以上全部满足,则返回"判定结果:通过",否则返回"判定结果:不通过"。
varresult=function(){
//以下为多组测试数据
varcases=[{
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,newDate(),"hahaha",(function(){}),undefined],
arr2:[undefined,(function(){}),"okokok",newDate(),false,2,window],
expect:true
},{
arr1:[newDate()],
arr2:[{}],
expect:false
},{
arr1:[window],
arr2:[{}],
expect:false
},{
arr1:[undefined,1],
arr2:[null,2],
expect:false
},{
arr1:[newObject,newObject,newObject],
arr2:[{},{},null],
expect:false
},{
arr1:null,
arr2:null,
expect:false
},{
arr1:[],
arr2:undefined,
expect:false
},{
arr1:"abc",
arr2:"cba",
expect:false
}];
//使用for循环,通过arraysSimilar函数验证以上数据是否相似,如相似显示“通过”,否则"不通过",所以大家要完成arraysSimilar函数,具体要求,详见任务要求。
for(vari=0;i
这个文件为testData.js。主要任务是完成arraysSimilar函数。
二、arraySimilar函数
1、我的写法
1、判断2个参数是否都是数组,不是就返回false;
2、判断2个数组长度是否一致,不是直接返回fasle;
3、新建2个临时数组temp1,temp2并初始化为0,用来存放arr1和arr2中各种类型的个数。
vartemp1=[0,0,0,0,0,0,0,0];
vartemp2=[0,0,0,0,0,0,0,0];
4、遍历2个arr1和arr2,每遍历一个元素,将对应类型加1。
5、完成arr1和arr2的遍历后,通过temp1.toString()和temp2.toString()是否相等得出2个数组是否相似。
UntitledDocument
/*
*param1Array
*param2Array
*returntrueorfalse
*/
functionarraysSimilar(arr1,arr2){
console.log("arr1为"+arr1);
console.log("arr2为"+arr2);
if(!(arr1instanceofArray)||!(arr2instanceofArray)){
document.write(false+"
");
returnfalse;
}elseif(arr1.length!=arr2.length){
document.write(false+"
");
returnfalse;
}
vartemp1=[0,0,0,0,0,0,0,0];
vartemp2=[0,0,0,0,0,0,0,0];
//初始化temp1
for(i=0;i ");
returntrue;
}else{
document.write(false+"
");
returnfalse;
}
}
//返回参数的javascript类型
functionjsType(arg){
//判断字符串
if(typeofarg=="string"){
console.log("string");
return"String";
}
//判断Boolean
if(typeofarg=="boolean"){
console.log("boolean");
return"Boolean";
}
//判断Number
if(typeofarg=="number"){
console.log("Number");
return"Number";
}
//判断Undefined
if(typeofarg=="undefined"){
console.log("Undefined");
return"Undefined";
}
//判断Null(不考虑IE8以下)//看了答案发现直接===null判断就好了
if(Object.prototype.toString.apply(arg)=="[objectNull]"){
console.log("Null");
return"Null";
}
//判断Function
if(typeofarg=="function"){
console.log("Function");
return"Function";
}
//判断日期
if(arginstanceofDate){
console.log("Date");
return"Date";
}
//判断window//看了答案发现直接===window判断就好了
if(arginstanceofWindow){
console.log("window");
return"Window";
}
}
虽然代码略粗糙,但是功能完成了。网上看了其他人的答案确实不同的人做法不一样,有些值得借鉴的地方。
2、其他答案
建一个类型对象数组obj,初始化为零,arr1遍历时每个元素对应的类型加一,arr2遍历时每个元素对应的类型减一,最终判断obj里所有键的值都为0即相似数组。
functioncheck(i){
//除了function其他的引用类型用instanceof来判定
if(iinstanceofDate){
return'date';
}
elseif(iinstanceofWindow){
return'window';
}
//typeof可以判断基本类型(numberstringbooleannull(typeof返回object)undefined)和引用类型的function类型
if(typeofi==='number')return'number';
elseif(typeofi==='string')return'string';
elseif(typeofi==='boolean')return'boolean';
elseif(typeofi==='function')return'function';
//typeofnull返回object
elseif(typeofi==='object'){
if(i===null){
return'null';
}else{
return'object';
}
}
elseif(typeofi==='undefined'){
return'undefined';
}
}
functionarraysSimilar(arr1,arr2){
if(!arr1||!arr2){returnfalse;}
if(!(arr1instanceofArray)||!(arr2instanceofArray))returnfalse;
if(arr1.length!=arr2.length)returnfalse;
varobj={
'number':0,
'string':0,
'boolean':0,
'undefined':0,
'null':0,
'function':0,
'date':0,
'object':0,
'window':0
};
for(vari=0;i
还有一个答案,差不多算标准答案,当然这种题也没有标准答案。和上个答案的差别是,用map(在js中也就是对象)存放数据类型和次数,这个map初始化为{},在后面动态生成的。
/**
*String,Boolean,Number,undefined,null,函数,日期,window
*/
functionarraysSimilar(arr1,arr2){
//判断参数,确保arr1,arr2是数组,若不是直接返回false
if(!(arr1instanceofArray)
||!(arr2instanceofArray)){
returnfalse;
}
//判断长度
if(arr1.length!==arr2.length)returnfalse;
vari=0,
n=arr1.length,
countMap1={},//用来计算数组元素数据类型个数的map,key是TYPES中的类型字符串,value是数字表示出现次数。
countMap2={},
t1,t2,
TYPES=['string','boolean','number','undefined','null',
'function','date','window'];
//因为是无序的,用一个对象来存储处理过程。key为类型,value为该类型出现的次数。
//最后校验:若每一种数据类型出现的次数都相同(或都不存在),则证明同构。
for(;i
还有一个比较简洁也好理解的解法
/*
*param1Array
*param2Array
*returntrueorfalse
*/
functiontype(a){
returna===null?'[objectNull]':Object.prototype.toString.apply(a);//hackie678
}
functionarraysSimilar(arr1,arr2){
if(!Array.isArray(arr1)||!Array.isArray(arr2)||arr1.length!=arr2.length){returnfalse;}
vararr3=[];
vararr4=[];
varx;
for(variinarr1){
arr3.push(type(arr1[i]));
arr4.push(type(arr2[i]));
}
if(arr3.sort().toString()==arr4.sort().toString()){
returntrue;
}else{
returnfalse;
}
}
还有一个精妙的解法,我对这种不感兴趣,没仔细看。
varglobal=window;
functionarraysSimilar(arr1,arr2){
return(arr1instanceofArray&&arr2instanceofArray)&&JSON.stringify(arr1.map(function(v){
returnnull===v?"☀":(vinstanceofDate?"❤":(v===global?"❀":typeofv));
}).sort())===JSON.stringify(arr2.map(function(v){
returnnull===v?"☀":(vinstanceofDate?"❤":(v===global?"❀":typeofv));
}).sort());
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。