分享几道JavaScript相关的面试题
一。字符串的反转
这里提供了两种解题思路。如果各位读者还有其他的思路,可以分享交流,请不要吝啬!
第一方式:就不说思路,看代码之后,一目了然。
1 <script type="text/javascript"> 2 function foo(){ 3 var str = 'a,b,c,d,e,f,g'; 4 var s = reverse(str);//字符串反转 5 console.log(s); 6 if(s === 'g,f,e,d,c,b,a'){ 7 console.log('成功。'); 8 }else{ 9 console.log('失败。'); 10 } 11 } 12 function reverse(str){ 13 var sp = str.split(','); 14 //保存反转之后的字符串 15 var new_str = ''; 16 /*从后往前取,用逗号分隔*/ 17 for(var i = sp.length-1;i>=0;i--){ 18 new_str += sp[i]+','; 19 } 20 /*取到length-1,否则会取到最后一个逗号。*/ 21 new_str = new_str.substring(0,new_str.length-1); 22 return new_str; 23 } 24 </script>
输出的结果在这:
第二种,用到的是javascript的自带的API。
1 <script type="text/javascript"> 2 function foo(){ 3 var str = 'a,b,c,d,e,f,g'; 4 var s = reverse(str); 5 6 if(s == 'g,f,e,d,c,b,a'){ 7 alert('成功。'); 8 } 9 else{ 10 alert('失败。'); 11 } 12 } 13 function reverse(str){ 14 return str.split(',').reverse().join(','); 15 } 16 </script>
二。编写一个JavaScript函数 parseQueryString,它的用途是把URL参数解析为一个对象,如:var url = “http://witmax.cn/index.php?key0=0&key1=1&key2=2″
URL的编码规则:每对name/value由&;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值
思路是这样的:
1.用?将url拆成两部分,第一部分为:http://witmax.cn/index.php,第二部分为:key0=0&key1=1&key2=2。也就是将地址和参数分开,保存在一个数组中。
1 var arr = url.split('?');2 console.log(arr.toString());
结果:
2. 在第一的基础上将之前的第二部分,也就是参数部分,用&拆成多个部分,如key0=0,key1=1。然后用=号将键值对拆开,key,value。
1 arr = arr[1].split('&'); 2 console.log(arr.join(',')); 3 for(var i = 0, len = arr.length; i < len; i++){ 4 var a = arr[i].split('='); 5 params[a[0]] = a[1]; 6 }
控制台输出:
下面给出完整的代码:
1 <script type="text/javascript"> 2 /* 3 * 将URL参数解析为一个对象 4 * @param url 被解析的url地址。 5 * 如:http://witmax.cn/index.php?key0=0&key1=1&key2=2 6 * */ 7 function parseQueryString(url){ 8 /*如果地址为空或者url没有参数则直接返回空null*/ 9 if(url == null || url.indexOf('?') == -1){ 10 return null; 11 } 12 var params = {}; 13 /* 14 * 用?将url拆成两部分,第一部分为:http://witmax.cn/index.php 15 * 第二部分为:key0=0&key1=1&key2=2 16 * */ 17 var arr = url.split('?'); 18 console.log(arr.toString()); 19 if(arr.length <= 1){ 20 return params; 21 } 22 /* 23 * 将之前的第二部分用&拆成多个部分,键值对 24 * 然后用=号将键值对拆开,key = value 25 * */ 26 arr = arr[1].split('&'); 27 console.log(arr.join(',')); 28 for(var i = 0, len = arr.length; i < len; i++){ 29 var a = arr[i].split('='); 30 params[a[0]] = a[1]; 31 } 32 return params; 33 } 34 console.log(parseQueryString('http://witmax.cn/index.php? key0=0&key1=1&key2=2')); 35 </script>
三。鼠标点击页面中的任意标签,alert该标签的名称
注意一下浏览器的兼容性。
简单的说一下target和srcElement以及event。
target和srcElement:
JS中event.srcElement是IE中的用法,event.target是非IE中的用法.
实际使用中可以用:obj = event.srcElement ? event.srcElement : event.target;
event:
1、在IE中,event对象是作为window.event全局对象存在的。
2、在firefox中,event对象是作为事件的参数存在的。
1 获取元素事件对象: 2 function getEventTarget(e){ 3 e = window.event || e; 4 return e.srcElement || e.target; 5 } 6 7 /*10 核心部分都在上面了。 11 12 */
给出代码:
1 <script type="text/javascript"> 2 document.onclick = function(evt){ 3 var e = window.event || evt; 4 var tag = e['target'] || e['srcElement'] 5 alert(tag.tagName); 6 }; 7 </script>
四。编写一个方法 求一个字符串的字节长度
假设:一个英文字符占用一个字节,一个中文字符占用两个字节。
主要用到的方法是charCodeAt()。这也是解题的核心,将中英文分开计算。
charCodeAt的返回的是指定位置字符的unicode码值,而大于255的编码值为非常规字符,如中文,日文等
1 <script type="text/javascript"> 2 function getBytes(str){ 3 if(!arguments.length || !str) 4 return null; 5 if(str.length == '') 6 return 0; 7 var len = str.length; 8 var bytes = 0;//记录字节数 9 for(var i = 0; i < len; i++){ 10 /*charCodeAt的返回的是指定位置字符的unicode码值,而大于255的编码值为非常规字符,如中文,日文等*/ 11 if(str.charCodeAt(i)>255){ 12 bytes+=2; 13 }else{ 14 bytes++; 15 } 16 } 17 return bytes; 18 } 19 console.log(getBytes('代码之美,beautiful code'));//24 20 </script>
完!