电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Javascript類型判斷相關(guān)例題及解析

瀏覽:8日期:2023-10-17 09:55:29

題目:

請(qǐng)?jiān)趇ndex.html文件中,編寫arraysSimilar函數(shù),實(shí)現(xiàn)判斷傳入的兩個(gè)數(shù)組是否相似。具體需求:

1. 數(shù)組中的成員類型相同,順序可以不同。例如[1, true] 與 [false, 2]是相似的。

2. 數(shù)組的長(zhǎng)度一致。

3. 類型的判斷范圍,需要區(qū)分:String, Boolean, Number, undefined, null, 函數(shù),日期, window.

當(dāng)以上全部滿足,則返回'判定結(jié)果:通過(guò)',否則返回'判定結(jié)果:不通過(guò)'。

一、測(cè)試用例

var result=function(){ //以下為多組測(cè)試數(shù)據(jù) 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循環(huán), 通過(guò)arraysSimilar函數(shù)驗(yàn)證以上數(shù)據(jù)是否相似,如相似顯示“通過(guò)”,否則'不通過(guò)',所以大家要完成arraysSimilar函數(shù),具體要求,詳見(jiàn)任務(wù)要求。for(var i=0;i<cases.length;i++){if(arraysSimilar(cases[i].arr1,cases[i].arr2)!==cases[i].expect) { document.write('不通過(guò)!case'+(i+1)+'不正確!arr1='+JSON.stringify(cases[i].arr1)+', arr2='+JSON.stringify(cases[i].arr2)+' 的判斷結(jié)果不是'+cases[i].expect); return false;} } return true; }(); document.write('判定結(jié)果:'+(result?'通過(guò)':'不通過(guò)'));

這個(gè)文件為testData.js。主要任務(wù)是完成arraysSimilar函數(shù)。

二、arraySimilar函數(shù)

1、我的寫法

1、判斷2個(gè)參數(shù)是否都是數(shù)組,不是就返回false;

2、判斷2個(gè)數(shù)組長(zhǎng)度是否一致,不是直接返回fasle;

3、新建2個(gè)臨時(shí)數(shù)組temp1,temp2并初始化為0,用來(lái)存放arr1和arr2中各種類型的個(gè)數(shù)。

var temp1 = [0, 0, 0, 0, 0, 0, 0, 0];var temp2 = [0, 0, 0, 0, 0, 0, 0, 0];

4、遍歷2個(gè)arr1和arr2,每遍歷一個(gè)元素,將對(duì)應(yīng)類型加1。

5、完成arr1和arr2的遍歷后,通過(guò)temp1.toString()和temp2.toString()是否相等得出2個(gè)數(shù)組是否相似。

<!DOCTYPE HTML><html><meta charset='utf-8'><head> <meta http-equiv='Content-Type' content='text/html; charset=gb18030'> <title>Untitled Document</title></head><body> <script type='text/javascript'> /* * param1 Array * param2 Array * return true or false */ function arraysSimilar(arr1, arr2) { console.log('arr1為' + arr1); console.log('arr2為' + arr2); if (!(arr1 instanceof Array) || !(arr2 instanceof Array)) { document.write(false + '<br/>'); return false; } else if (arr1.length != arr2.length) { document.write(false + '<br/>'); return false; } var temp1 = [0, 0, 0, 0, 0, 0, 0, 0]; var temp2 = [0, 0, 0, 0, 0, 0, 0, 0]; //初始化temp1 for (i = 0; i < arr1.length; i++) { console.log('arr1的第' + i + '個(gè)值為' + arr1[i]); switch (jsType(arr1[i])) {case 'String': temp1[0]++; break;case 'Boolean': temp1[1]++; break;case 'Number': temp1[2]++; break;case 'Undefined': temp1[3]++; break;case 'Null': temp1[4]++; break;case 'Function': temp1[5]++; break;case 'Date': temp1[6]++; break;case 'Window': temp1[7]++; break; } console.log('arr2的第' + i + '個(gè)值為' + arr2[i]); //初始化temp2 switch (jsType(arr2[i])) {case 'String': temp2[0]++; break;case 'Boolean': temp2[1]++; break;case 'Number': temp2[2]++; break;case 'Undefined': temp2[3]++; break;case 'Null': temp2[4]++; break;case 'Function': temp2[5]++; break;case 'Date': temp2[6]++; break;case 'Window': temp2[7]++; break; } } //判斷temp1和temp2是否相等 if (temp1.toString() === temp2.toString()) { document.write(true + '<br/>'); return true; } else { document.write(false + '<br/>'); return false; } } //返回參數(shù)的javascript類型 function jsType(arg) { //判斷字符串 if (typeof arg == 'string') { console.log('string'); return 'String'; } //判斷Boolean if (typeof arg == 'boolean') { console.log('boolean'); return 'Boolean'; } //判斷Number if (typeof arg == 'number') { console.log('Number'); return 'Number'; } //判斷Undefined if (typeof arg == 'undefined') { console.log('Undefined'); return 'Undefined'; } //判斷Null(不考慮IE8以下) //看了答案發(fā)現(xiàn)直接=== null判斷就好了 if (Object.prototype.toString.apply(arg) == '[object Null]') { console.log('Null'); return 'Null'; } //判斷Function if (typeof arg == 'function') { console.log('Function'); return 'Function'; } //判斷日期 if (arg instanceof Date) { console.log('Date'); return 'Date'; } //判斷window //看了答案發(fā)現(xiàn)直接=== window 判斷就好了 if (arg instanceof Window) { console.log('window'); return 'Window'; } } </script> <script src='http://www.hdgsjgj.cn/bcjs/testData.js'></script></body></html>

雖然代碼略粗糙,但是功能完成了。網(wǎng)上看了其他人的答案確實(shí)不同的人做法不一樣,有些值得借鑒的地方。

2、其他答案

建一個(gè)類型對(duì)象數(shù)組obj,初始化為零,arr1遍歷時(shí)每個(gè)元素對(duì)應(yīng)的類型加一,arr2遍歷時(shí)每個(gè)元素對(duì)應(yīng)的類型減一,最終判斷obj里所有鍵的值都為0即相似數(shù)組。

function check(i){ //除了function 其他的引用類型用instanceof來(lái)判定 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; }

還有一個(gè)答案,差不多算標(biāo)準(zhǔn)答案,當(dāng)然這種題也沒(méi)有標(biāo)準(zhǔn)答案。和上個(gè)答案的差別是,用map(在js中也就是對(duì)象)存放數(shù)據(jù)類型和次數(shù),這個(gè)map初始化為{},在后面動(dòng)態(tài)生成的。

/** * String, Boolean, Number, undefined, null, 函數(shù),日期, window */function arraysSimilar(arr1, arr2) { // 判斷參數(shù),確保arr1, arr2是數(shù)組,若不是直接返回false if (!(arr1 instanceof Array) || !(arr2 instanceof Array)) { return false; } // 判斷長(zhǎng)度 if (arr1.length !== arr2.length) return false; var i = 0, n = arr1.length, countMap1 = {}, // 用來(lái)計(jì)算數(shù)組元素?cái)?shù)據(jù)類型個(gè)數(shù)的map,key是TYPES中的類型字符串,value是數(shù)字表示出現(xiàn)次數(shù)。 countMap2 = {}, t1, t2, TYPES = [’string’, ’boolean’, ’number’, ’undefined’, ’null’, ’function’, ’date’, ’window’]; // 因?yàn)槭菬o(wú)序的,用一個(gè)對(duì)象來(lái)存儲(chǔ)處理過(guò)程。key為類型, value為該類型出現(xiàn)的次數(shù)。 // 最后校驗(yàn):若每一種數(shù)據(jù)類型出現(xiàn)的次數(shù)都相同(或都不存在),則證明同構(gòu)。 for (; i < n; i++) { t1 = typeOf(arr1[i]); t2 = typeOf(arr2[i]); if (countMap1[t1]) { countMap1[t1]++; } else { countMap1[t1] = 1; } if (countMap2[t2]) { countMap2[t2]++; } else { countMap2[t2] = 1; } } // 因?yàn)閠ypeof只能判斷原始類型,且無(wú)法判斷null(返回'object'),所以自己寫typeof方法擴(kuò)展。 function typeOf(ele) { var r; if (ele === null) r = ’null’; // 判斷null else if (ele instanceof Array) r = ’array’; // 判斷數(shù)組對(duì)象 else if (ele === window) r = ’window’; // 判斷window else if (ele instanceof Date) r = ’date’ // 判斷Date對(duì)象 else r = typeof ele; // 其它的,使用typeof判斷 return r; } for (i = 0, n = TYPES.length; i < n; i++) { if (countMap1[TYPES[i]] !== countMap2[TYPES[i]]) { return false; } } return true;}

還有一個(gè)比較簡(jiǎn)潔也好理解的解法

<script type='text/javascript'> /* * param1 Array * param2 Array * return true or false */ function type(a){ return a === null ? ’[object Null]’:Object.prototype.toString.apply(a); //hack ie678 } function arraysSimilar(arr1, arr2){ if(!Array.isArray(arr1) || !Array.isArray(arr2) ||arr1.length!=arr2.length){return false;} var arr3=[]; var arr4=[]; var x; for(var i in arr1){arr3.push(type(arr1[i]));arr4.push(type(arr2[i])); } if(arr3.sort().toString()==arr4.sort().toString()){return true; }else{return false; } } </script>

還有一個(gè)精妙的解法,我對(duì)這種不感興趣,沒(méi)仔細(xì)看。

var global = window;function arraysSimilar(arr1, arr2){ return (arr1 instanceof Array && arr2 instanceof Array) && JSON.stringify(arr1.map(function(v) { return null === v ? '☀' : (v instanceof Date ? '❤' : (v === global ? '❀' : typeof v)); }).sort()) === JSON.stringify(arr2.map(function(v) { return null === v ? '☀' : (v instanceof Date ? '❤' : (v === global ? '❀' : typeof v)); }).sort());}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | 能量回馈_制动单元_电梯节能_能耗制动_深圳市合兴加能科技有限公司 | 移动机器人产业联盟官网 | 德国BOSCH电磁阀-德国HERION电磁阀-JOUCOMATIC电磁阀|乾拓百科 | 福州仿石漆加盟_福建仿石漆厂家-外墙仿石漆加盟推荐铁壁金钢(福建)新材料科技有限公司有保障 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 荣事达手推洗地机_洗地机厂家_驾驶式扫地机_工业清洁设备 | 广州小程序开发_APP开发公司_分销商城系统定制_小跑科技 | 北京软件开发_软件开发公司_北京软件公司-北京宜天信达软件开发公司 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 海水晶,海水素,海水晶价格-潍坊滨海经济开发区强隆海水晶厂 | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 标准光源箱|对色灯箱|色差仪|光泽度仪|涂层测厚仪_HRC大品牌生产厂家 | 太原装修公司_山西整装家装设计_太原室内装潢软装_肖邦家居 | 压装机-卧式轴承轮轴数控伺服压装机厂家[铭泽机械] | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 紧急切断阀_气动切断阀_不锈钢阀门_截止阀_球阀_蝶阀_闸阀-上海上兆阀门制造有限公司 | 电动葫芦|防爆钢丝绳电动葫芦|手拉葫芦-保定大力起重葫芦有限公司 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 河北码上网络科技|邯郸小程序开发|邯郸微信开发|邯郸网站建设 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 无锡装修装潢公司,口碑好的装饰装修公司-无锡索美装饰设计工程有限公司 | 氢氧化钙设备_厂家-淄博工贸有限公司| 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 14米地磅厂家价价格,150吨地磅厂家价格-百科 | 二手回收公司_销毁处理公司_设备回收公司-找回收信息网 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 森旺-A级防火板_石英纤维板_不燃抗菌板装饰板_医疗板 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 |