前端面试JavaScript编程
来源:互联网 发布:apache 监控 编辑:程序博客网 时间:2024/05/16 18:14
1.请写一个字符串转成驼峰的方法?例如:border-bottom-color -> borderBottomColor。
function camel(str){ str=str.replace(/-([a-z])/g,function(a,b){ return b.toUpperCase(); }); return str;} var str = 'border-bottom-color' alert(camel(str));//borderBottomColor
jQuery中实现的方式:
var rmsPrefix = /^-ms-/,rdashAlpha = /-([\da-z])/gi;fcamelCase = function( all, letter ) {return letter.toUpperCase();};camelCase = function( string ) {return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );};利用数组实现:
function camel(string){var arr = string.split('-');for(i=0;i<arr.length;i++){arr[1]=arr[i].charAt(0).toUpperCase() +arr[i].substr(1);}arr = arr.join('');return arr;} var str = 'border-bottom-color' alert(camel(str));//borderBottomColorECMAScript还提供了三个基于子字符串创建新字符串的方法:slice()、substr()和substring()。这三个方法都会返回被操作字符串的一个子字符串,而且也都接受一或两个参数。第一个参数指定子字符串的开始位置,第二个参数(在指定的情况下)表示子字符串到哪里结束。具体来说,slice()和substring()的第二个参数指定的是子字符串最后一个字符后面的位置。而substr()的第二个参数指定的则是返回的字符个数。如果没有给这些方法传递第二个参数,则将字符串的长度作为结束位置。与concat()方法一样,slice()、substr()和substring()也不会修改字符串本身的值——它们只是返回一个基本类型的字符串值,对原始字符串没有任何影响。请看下面的例子。
var stringValue = "hello world";alert(stringValue.slice(3)); //"lo world"alert(stringValue.substring(3)); //"lo world"alert(stringValue.substr(3)); //"lo world"alert(stringValue.slice(3, 7)); //"lo w"alert(stringValue.substring(3,7)); //"lo w"alert(stringValue.substr(3, 7)); //"lo worl"当 slice()、 substr()和 substring()只有一个参数时,三者效果相同;
如果记不清substr()和 substring()的区别,就只用substring()。
2.查找字符串中出现最多的字符和个数?例如:sdjksfssscfssdd -> 字符最多的是s,出现了7次。
自己使用for循环:
var str = 'sdjksfssscfssdd';//alert(str[0]);//s,如果是在 IE7 及更早版本中使用这种语法,会返回 undefined 值function letterMost(str){ var max=0, letter; var arr = str.split(''); for(i=0;i<arr.length-1;i++){ var n=1; for(j=i+1;j<arr.length;j++){ if(arr[i]==arr[j]){ n++; } } if(max<n){ max=n; letter=arr[i] } } alert('出现最多的字母:'+letter+'出现次数:'+max);}letterMost(str);//出现最多的字母:s出现次数:7利用json:
var str = 'sdjksfssscfssdd';function letterMost(str){ var arr = str.split(''); var obj = {}; var maxnum=0,maxletter=0; for(i=0;i<arr.length;i++){ obj[arr[i]]?obj[arr[i]]++:obj[arr[i]]=1; if(maxnum<obj[arr[i]]){ maxnum=obj[arr[i]]; maxletter=arr[i]; } } alert(maxletter+'出现了'+maxnum+'次');}letterMost(str);//s出现了7次
利用数组和正则表达式:
function unique(str){ var max = 0,maxstr = ''; arr = str.split('').sort(); str = arr.join(''); str.replace(/(\w)\1+/g,function(a,b){ if(a.length>max){ max = a.length; maxstr =b; } }) return maxstr+'出现的次数是'+max; }3.如何给字符串加千分符?例如:3562123761 -> 3,562,123,761。
使用正则表达式:
var str = '3562123761';function qianfenfu(str){return str.replace(/(\d)(?=(\d{3})+$)/g,'$1,');}alert(qianfenfu(str));使用字符串函数:
var str = '3562123761';function qianfenfu(str){var num = str.length%3;var arr = [];if(num!=0){arr.push(str.substring(0,num));}for(;num<str.length-1;num+=3){arr.push(str.substr(num,3))}return arr.join(',');}alert(qianfenfu(str));
4.数组去重:
使用indexOf()方法,缺点:在IE6-8浏览器中,不存在此方法。
function unique(arr) { var ret = []; var hash = {}; for (var i = 0; i < arr.length; i++) { var item = arr[i]; if(ret.indexOf(item)===-1){ ret.push(item); } } return ret;} var arr = [112,'1','你好',112,1,'你好','str','str1'];console.log(unique(arr));
利用json对象实现:
function unique(arr) { var ret = []; var hash = {}; for (var i = 0; i < arr.length; i++) { var item = arr[i]; var key = typeof(item) + item; if(!hash[key]){ ret.push(item); hash[key]=true; } } return ret;} var arr = [112,'1','你好',112,1,'你好','str','str1'];console.log(unique(arr));
在 JavaScript 里,对象的键值只能是字符串,因此需要var key = typeof(item) + item
来区分数值 1
和字符串 '1'
等情况。
5.数组排序:[1,55,33,23,56,7,8,99]=>[1,7,8,23,33,55,56,99]
利用JavaScript中数组函数sort进行排序:
var arr=[1,55,33,23,56,7,8,99]; function compare(a,b){ return a-b; } arr.sort(compare); alert(arr);//1,7,8,23,33,55,56,99sort(compare)的实现:利用了冒泡算法,将数组中的相邻的元素传递给compare()函数,compare()返回真,则进行互换。
当a[i]>a[i+1]时,compare()>0为真,两者值进行互换
function compare(a,b){return a-b;} function sort(arr,compare){ for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length-1-i;j++){ if(compare(arr[j],arr[j+1])>0){ var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } var arr=[1,55,33,23,56,7,8,99]; sort(arr,compare); alert(arr);//1,7,8,23,33,55,56,99将compare()改为:
function compare(a,b){return b-a;}当a[i]<a[i+1]时,compare()>0为真,两者值进行互换,就是逆序排列。
选择排序:无论什么数据排序都是O(n2)的时间复杂度。
function selectSort(arr){ var temp = 0; for(var i=0;i<arr.length-1;i++){ for(var j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } var arr=[1,55,33,23,56,7,8,99]; selectSort(arr); alert(arr);//1,7,8,23,33,55,56,99快速排序:T(n)=O(nlogn)
function quickSort(arr){ if(arr.length<=1){ return arr; } var pivotIndex = Math.floor(arr.length/2) var left = []; var right = []; var pivot = arr.splice(pivotIndex,1)[0]; for(var i=0;i<arr.length;i++){ if(arr[i]<pivot){ left.push(arr[i]); }else{ right.push(arr[i]) } } return quickSort(left).concat([pivot],quickSort(right)); } var arr=[1,55,33,23,56,7,8,99]; alert(quickSort(arr));//1,7,8,23,33,55,56,99插入排序:T(n)=O(n2)
function insertSort(arr){ for(var i = 1;i<arr.length;i++){ var temp = arr[i];//关键是先将arr[i]取出来 var j = i-1; while(j>=0&&arr[j]>temp){ arr[j+1]=arr[j]; j--; } arr[j+1]=temp; } return arr; } var arr=[1,55,33,23,56,7,8,99]; alert(insertSort(arr));//1,7,8,23,33,55,56,99
6.截取URL地址中的query部分:
function param(url){if(url.indexOf('?')===-1){return '不存在参数';}var arr=url.split('?');var arr1=arr[1].split('&');var arr2=[];var obj = {};for(var i = 0;i<arr1.length;i++){arr2=arr1[i].split('=');obj[arr2[0]]=arr2[1];}return obj;}
7.用js实现随即选取10–100之间的10个数字,存入一个数组,并排序
function randomSort(){var arr = [];for(var i=0;i<10;i++){var num = parseInt(Math.random()*90)+10;arr.push(num);}arr.sort(function(a,b){return a-b;});return arr;}
8.JavaScript的bind()函数兼容处理:
Function.prototype.bind = Function.prototype.bind||function (context){var self = this;return function(){self.apply(context,arguments);};}
9.如何将类数组对象,转化为数组,例如将arguments类数组转化为数组:
function list() { return Array.prototype.slice.call(arguments);}var list1 = list(1, 2, 3); // [1, 2, 3]
10.JavaScript实现深拷贝:
function deepCopy(copy,src){var copy = copy ||{};for(var i in src){if(typeof src[i]==='object'){//必须是字符串形式,且第一个字母是小写copy[i]=(src[i].constructor===Array)?[]:{};deepCopy(copy[i],src[i]);}else{copy[i]=src[i];}}return copy;}var a = { name : { firstName : 'Tom' } }; var b = { name : {firstName : 'Jack',lastName:'Simith'} }; deepCopy(a,b); a.name.firstName= 'William'; alert(a.name.firstName);//William alert(b.name.firstName);//Jack浅拷贝:
function normalCopy(copy,src){var copy = copy ||{};for(var i in src){copy[i]=src[i];} return copy;}var a = { name : { firstName : 'Tom' } }; var b = { name : {firstName : 'Jack',lastName:'Simith'} }; normalCopy(a,b); a.name.firstName= 'William'; alert(a.name.firstName);//William alert(b.name.firstName);//William浅拷贝与深拷贝合并:第一个参数为布尔值,是否深拷贝
function clone(deep,copy,src){var copy = copy ||{};for(var i in src){if(deep){if(typeof src[i]==='object'){copy[i]=(src[i].constructor===Array)?[]:{};clone(deep,copy[i],src[i]);}else{copy[i]=src[i];}}else{copy[i]=src[i];}} return copy;}
var a = { name : { firstName : 'Tom' } }; var b = { name : {firstName : 'Jack',lastName:'Simith'} }; clone(true,a,b); //深拷贝a.name.firstName= 'William'; alert(a.name.firstName);//William alert(b.name.firstName);//Jack
var a = { name : { firstName : 'Tom' } }; var b = { name : {firstName : 'Jack',lastName:'Simith'} }; clone(false,a,b); //浅拷贝a.name.firstName= 'William'; alert(a.name.firstName);//William alert(b.name.firstName);//William
11.回文数:正读倒读都一样的整数,如1234321。求1000以内的回文数。
function palindrome(num){var str=num+'';var str1=str.split('').reverse().join('');if(str===str1){return true;}}var arr=[];var n=0;for(var i=0;i<1001;i++){var temp = palindrome(i);if(temp){arr.push(i);n++;}}alert(n);//10912.二分查找:优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
查找6在[1,2,3,4,5,6,7,8,9,10,11]中的位置
var arr=[1,2,3,4,5,6,7,8,9,10,11];var a=6;function binarySearch(a,arr){var mid=Math.floor(arr.length/2);if(a==arr[mid]){return mid;}else if(a<arr[mid]){var arr1=arr.slice(0,mid);binarySearch(a,arr1)}else{var arr1=arr.slice(mid);binarySearch(a,arr1);}}alert(binarySearch(a,arr));//5
13.写一个重复打印字符串对象的方法,输入一个整数,这个整数代表重复打印的字数,比如:
console.log('hello'.repeatify(3));
这样会打印出hellohellohello。
String.prototype.repeatify =String.prototype.repeatify ||function(times){ var str =''; for(var i =0; i < times; i++){ str +=this; } return str; };
阅读全文
0 0
- 前端面试JavaScript编程
- 前端JavaScript面试技巧
- 前端面试-JavaScript篇
- 前端面试之---javascript原型
- 前端JavaScript面试技巧全套
- 浅谈前端JavaScript编程风格
- 前端开发面试总结JavaScript部分
- web前端面试,包括javascript,css
- 前端面试知识点(JavaScript篇)
- 2.前端常见面试编程题整理
- JavaScript 前端编程使用小技巧
- 创建JavaScript对象的方法(前端面试)
- 面试某公司前端关于javascript中this的总结
- web前端面试-------javaScript基础知识点之数据类型
- 前端面试题目汇总(一)HTML、CSS、JavaScript
- 前端面试知识点锦集(JavaScript篇)
- 前端面试知识点锦集(JavaScript篇)绝对干货
- 前端面试系列之---javascript基础和数据类型
- 分享常见的几种页面静态化的方法 原链接:http://www.jb51.net/article/59619.htm
- Java中抽象类与接口的区别
- iOS OS X:关于iOS和OS X废弃的API你需要知道的一切
- hdoj-1596find the safest road
- Win10安装Python2.7以及PyCharm教程
- 前端面试JavaScript编程
- Java中的动态绑定
- RecyclerView添加下划线
- Leetcode. 682. Baseball Game
- springmvc和easyUI下的页面跳转
- React Native Modal踩坑
- 串口通讯摘要(转)
- 字符串旋转
- 二分查找算法(左闭右开区间)