JS编程题(字符串类 数组类)

1,求字符串的长度(单位是字节)

function getlength(str){
var len=str.length;
var bytes=len;
for(var i=0;i<len;i++){
if(str.charCodeAt(i)>255) //判断是中文还是英文,中文两个字节
bytes++;}
return bytes;}

将字符串转化为驼峰式

function toCamel(msg){
var arr=msg.split('-');
for(var i=1;i<arr.length;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].slice(1);
}
return arr.join('')}

请将一个URL的search部分参数与值转换成一个json对象


//search部分的参数格式:a=1&b=2&c=3

function getJsonFromUrlSearch(search){
    var item;
    var result={};
    if(search.indexOf('&')<0){
        item=search.split('=');
        result[item[0]]=item[1];
        return result;
    }
    var splitArray=search.split('&');
    for (var i = 0; i < splitArray.length; i++) {
        var obj = splitArray[i];
        item=obj.split('=');
        result[item[0]]=item[1];
    }
    return result;
}
var c=getJsonFromUrlSearch("a=1&b=2&c=3");

解析URL成一个对象?


            String.prototype.urlQueryString = function(){

                var url = this.split('?')[1].split('&'),

                    len = url.length;

         

                this.url = {};

                for(var i = 0; i < len; i += 1){

                    var cell = url[i].split('='),    

                        key = cell[0],

                        val = cell[1];

                    this.url[''+key+''] = val;

                } 

                return this.url;

            }

            var url = '?name=12&age=23';

            console.log(url.urlQueryString().age);

2,统计字符串中出现次数最多的字母数,或者统计字母的个数

function getmaxstr(str){
            if(str.length == 1){return str;}
            var newarr = [];
            for(var i = 0 ; ss= str.length, i<ss; i++ ){
                if(!newarr[str.charAt(i)]){
                    newarr[str.charAt(i)] = 1;
                }else{
                    newarr[str.charAt(i)] +=1;
                }
            }
            console.log(newarr);
            var maxkey='';
            var maxvalue=1;//设定一个值
            for(var k in newarr){
                if(newarr[k]> maxvalue){//根据这个值做判读 将数组中的每个元素 与这个值做比较! 如果大于他,那么将住宿
                    maxvalue = newarr[k];//出现的次数
                    maxkey = k;//次数最多的 字母
                }
            }
            console.log(maxkey);
            return maxvalue;
        }

3,统计数组中出现次数最多的字母数

    Array.prototype.diaohuan=function(arr){
        var newarr=[];
        for(var i = 0; i<this.length; i++){
            if(!newarr[this[i]] ){
                newarr[this[i]] = 1;
            }else{
                newarr[this[i]] +=1;
            }
        }
        console.log(newarr);
        var maxkey = 1;
        var maxvalue ="";
        for (var k in newarr){
            if(newarr[k] > 1){
                maxvalue =newarr[k];
                maxkey = k;
            }    
        }
        return maxvalue;
        console.log(maxvalue);
    }
      alert(arr.diaohuan());

4.清空字符串前后的空格

function cleans(str){
if(str&&typeof str==='string'){
  return str.replace(/(^\s*)|(\s*$)/g, "");}
}
function trim(str){ 
str = str.replace(/^(\s|\u00A0)+/,''); 
for(var i=str.length-1; i>=0; i--){ 
if(/\S/.test(str.charAt(i))){ 
str = str.substring(0, i+1); 
break; } } 
return str; 
} 

5.实现数组合并并去重

function MergeArray(arr1,arr2){
    var _arr = new Array();
    for(var i=0;i<arr1.length;i++){
       _arr.push(arr1[i]);
    }
    for(var i=0;i<arr2.length;i++){
        var flag = true;
        for(var j=0;j<arr1.length;j++){
            if(arr2[i]==arr1[j]){
                flag=false;
                break;
            }
        }
        if(flag){
            _arr.push(arr2[i]);
        }
    }
    return _arr;
}
 function uniqueArr(array) {
        array.sort();
        var n = [];
        for (var i = 0; i < array.length; i++) {
            if (array[i] !== n[n.length - 1]) {
                n.push(array[i]);
            }
        }
        return n;
    }

正则表达式

正则表达式--验证手机号码:13[0-9]{9} 
实现手机号前带86或是+86的情况:^((\+86)|(86))?(13)\d{9}$ 
电话号码与手机号码同时验证:(^(\d{3,4}-)?\d{7,8})$|(13[0-9]{9})  
提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F)  *=  *('|")?(\w|\\|\/|\.)+('|"|  *|>)?   
提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*   
提取信息中的图片链接:(s|S)(r|R)(c|C)  *=  *('|")?(\w|\\|\/|\.)+('|"|  *|>)? 
提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)     
提取信息中的中国手机号码:(86)*0*13\d{9}     
提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}     
提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}     
提取信息中的中国邮政编码:[1-9]{1}(\d+){5}     
提取信息中的中国身份证号码:\d{18}|\d{15}     
提取信息中的整数:\d+     
提取信息中的浮点数(即小数):(-?\d*)\.?\d+     
提取信息中的任何数字  :(-?\d*)(\.\d+)?   
提取信息中的中文字符串:[\u4e00-\u9fa5]*     
提取信息中的双字节字符串  (汉字):[^\x00-\xff]*

回文

function isPalindrome(str) {
    str = str.replace(/\W/g, '').toLowerCase();    return (str == str.split('').reverse().join(''));
}

2.写一个 sum方法,在使用下面任一语法调用时,都可以正常工作。

console.log(sum(2,3)); // Outputs 5console.log(sum(2)(3)); // Outputs 5
(至少)有两种方法可以做到:

方法1

function sum(x) { if (arguments.length == 2) { return arguments[0] + arguments[1];
} else { return function(y) { return x + y; };
}
}
在JavaScript中,函数可以提供到 arguments 对象的访问,arguments 对象提供传递到函数的实际参数的访问。这使我们能够使用 length 属性来确定在运行时传递给函数的参数数量。

如果传递两个参数,那么只需加在一起,并返回。

否则,我们假设它被以 sum(2)(3)这样的形式调用,所以我们返回一个匿名函数,这个匿名函数合并了传递到 sum()的参数和传递给匿名函数的参数。

方法2

function sum(x, y) { if (y !== undefined) { return x + y;
} else { return function(y) { return x + y; };
}
}
当调用一个函数的时候,JavaScript不要求参数的数目匹配函数定义中的参数数量。如果传递的参数数量大于函数定义中参数数量,那么多余参数将简单地被忽略。另一方面,如果传递的参数数量小于函数定义中的参数数量,那么缺少的参数在函数中被引用时将会给一个 undefined值。所以,在上面的例子中,简单地检查第2个参数是否未定义,就可以相应地确定函数被调用以及进行的方式。
随机选10-100之间10个数字,并排序

function randoms (start,end){
return Math,floor(Math.random()*(end-start+1)+start);
}
var res=[];
for(var i=0;i<10;i++){
res.push(randoms(10,100));
res.sort();
}

把两个数组合并,并删除第二个元素

var arr3=arr1.concat(arr2);
arr3.splice(1,1);

一对兔子,每月生一对小兔子,小兔子从第二个月又能生,问 n个月生多少

function rabbit(nu)
  1. .form中的input可以设置为readonly和disable,请问2者有什么区别?
    readonly不可编辑,但可以选择和复制;值可以传递到后台
    disabled不能编辑,不能复制,不能选择;值不可以传递到后台

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

  function clone(Obj) {  

        var buf;  

        if (Obj instanceof Array) {  

            buf = [];//创建一个空的数组

            var i = Obj.length;  

            while (i--) {  

                buf[i] = clone(Obj[i]);  

            }  

            return buf;   

        }else if (Obj instanceof Object){  

            buf = {};//创建一个空对象

            for (var k in Obj) { //为这个对象添加新的属性

                buf[k] = clone(Obj[k]);  

            }  

            return buf;  

        }else{ //普通变量直接赋值

            return Obj;  

        }  

    }

给String对象添加一个方法,传入一个string类型的参数,然后将string的每个字符间价格空格返回,例如:
addSpace(“hello world”) // -> ‘h e l l o w o r l d’

String.prototype.spacify = function(){
      return this.split('').join(' ');
    };

定义一个log方法,让它可以代理console.log的方法。
可行的方法一:

function log(msg) {

console.log(msg);

}

log(“hello world!”) // hello world!

如果要传入多个参数呢?显然上面的方法不能满足要求,所以更好的方法是:

function log(){

console.log.apply(console, arguments);

};
var User = {

count: 1,

getCount: function() {

return this.count;

}

};

console.log(User.getCount()); // what?

var func = User.getCount;

console.log(func()); // what?

问两处console输出什么?为什么?

答案是1和undefined。

func是在winodw的上下文中被执行的,所以会访问不到count属性。

继续追问,那么如何确保Uesr总是能访问到func的上下文,即正确返回1。正确的方法是使用Function.prototype.bind。兼容各个浏览器完整代码如下:

Function.prototype.bind = Function.prototype.bind || function(context){
var self = this;
return function(){
return self.apply(context, arguments);

};

}
var func = User.getCount.bind(User);
console.log(func());
//define

(function(window){

function fn(str){

    this.str=str;

}



fn.prototype.format = function(){

    var arg = ______;

    return this.str.replace(_____,function(a,b){

         return arg[b]||"";

  });

}

window.fn = fn;

})(window);

//use

(function(){

var t = new fn('<p><a href="{0}">{1}</a><span>{2}</span></p>');

console.log(t.format('http://www.alibaba.com','Alibaba','Welcome'));

})();

答案:访函数的作用是使用format函数将函数的参数替换掉{0}这样的内容,返回一个格式化后的结果:

第一个空是:arguments

第二个空是:/{(\d+)}/ig

删除数组成员

delete arr[index](删除成员)
arr.splice(index,1);(删除所占位置)

猜你喜欢

转载自blog.csdn.net/weixin_43836308/article/details/88707426