JS练习题(1)

 

1、找出对象obj不在原型链上的属性
        1、返回数组格式为key: value,冒号后有个空格
        2、结果数组不要求排序

 

答案:

 

function iterate(obj) {
	var arr=[];
	for (var attr in obj) {
		if (obj.hasOwnProperty(attr)) {
			arr.push(attr+": "+obj[attr]);
		}
	}
	return arr;
}

 

说明:for-in循环遍历对象的所有可枚举属性,hasOwnProperty()判断对象原型链是否有该属性
2、封装函数 f,使 f 的 this 指向指定的对象
答案:

 

function bindThis(f, oTarget) {
    return f.bind(oTarget);
}

 

说明:绑定this的几种方法
①函数.bind(对象),如f.bind(oTarget)
②函数.apply(对象,arguments)
③函数.call(对象,参数1,参数2...)
3、获取 url 中的参数
1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定参数名称,返回全部的参数对象 或者 {}
3. 如果存在多个同名参数,则返回数组
输入
http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe
输出
[1, 2, 3]
答案:
方法①

 

function getUrlParam(sUrl,sKey){
     var result = {};
     sUrl.replace(/\??(\w+)=(\w+)&?/g,function($0,$1,$2){
         if(result[$1] !== void 0){
             var t = result[$1];
             result[$1] = [].concat(t,$2);
         }else{
             result[$1] = $2;
         }
    });
    if(sKey === void 0){
          return result;
     }else{
           return result[sKey] || '';
     }
}

 

方法②

 

function getUrlParam(sUrl, sKey) {
    var keyArr=sUrl.split("?")[1].split("#");
    var keyVal=spliceVal(keyArr[0]); //key=1&key=2&key=3&test=4
    var hashVal=spliceVal(keyArr[1]); //hehe
    var obj={};
    //将数组keyVal和hashVal的key转换成对象obj的属性
    obj=getObj(keyVal,obj);
    obj=getObj(hashVal,obj);
    //将只有一个数组元素的数组修改为值
    for (var attr in obj) { 
        if (typeof obj[attr]=="object") {
            if (obj[attr].length==1) {
                obj[attr]=obj[attr][0];
            }
        }
    }
    //判断输出方式
    if (sKey!=undefined) {
        return obj[sKey];
    }else{
        return obj.key;
    }
}
function spliceVal(keyValArr){
    var arr=keyValArr.split("&");
    return arr;    
}
function getObj(arr,obj){
    var index=0;
    var tempKey="";
    var tempVal="";
    for (var i = 0; i < arr.length; i++) {
        index=arr[i].indexOf("="); //没找到时返回-1
        if (index!=-1) {
            tempKey=arr[i].slice(0,index);
            tempVal=arr[i].slice(index+1);
            tempVal=parseInt(tempVal);
            // alert(typeof tempVal);
            if (!obj[tempKey]) {
                obj[tempKey]=[tempVal];
            }else{
                obj[tempKey].push(tempVal);
            }
        }else{
            if (!obj[arr[i]]) {
                obj[arr[i]]="";
            }
        }
    }
    return obj;
}

 

4、题目描述
查找两个节点的最近的一个共同父节点,可以包括节点自身
输入描述:
oNode1 和 oNode2 在同一文档中,且不会为相同的节点
思路:利用递归验证一个节点是否包含另一个节点就好了。
答案:

 

function commonParentNode(oNode1, oNode2) {
    if(oNode1.contains(oNode2)){
        return oNode1;
    }else{
        return commonParentNode(oNode1.parentNode,oNode2);
    }
}

 

5、题目描述
根据包名,在指定空间中创建对象
输入描述:
namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
输出描述:
{a: {test: 1, b: {c: {d: {}}}}}
答案:

 

function namespace(oNamespace, sPackage) {
    var nameArr=sPackage.split(".");
    var curObj=oNamespace;
    for(var i=0;i<nameArr.length;i++){
        if(!curObj.hasOwnProperty(nameArr[i])){
            curObj[nameArr[i]]={};
            curObj=curObj[nameArr[i]];
        }
    }
    return oNamespace;
}

 

思路:主要就是判断当前对象是否有当前数组表示的属性,若没有则添加该属性,且属性值为一个对象
6、题目描述
为 Array 对象添加一个去除重复项的方法
输入
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
输出
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
答案:

 

Array.prototype.uniq = function () {
    var newArr=[];
    var flag = true;
    for(var i=0;i<this.length;i++){
        if(newArr.indexOf(this[i])==-1){
            if (this[i]!=this[i]) { //进入此条件语句的有{}和NAN
                if(flag){
                   newArr.push(this[i]);
                   flag = false;
                }
            }else{
                newArr.push(this[i]);
            }
        }
    }
    return newArr;
}

注意:

console.log({}=={}) //false
console.log(NaN==NaN) //false

console.log(null==null) //true

 

7、题目描述
用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等
答案:

 

function fibonacci(n) {
    var arr=[1,1];
    if(n<=0){
        return 0;
    }else if(n<=2){
        return 1;
    }else{
        for(var i=2;i<n;i++){
            arr[i]=arr[i-1]+arr[i-2];
        }
        return arr[n-1];
    }
}

 

8、题目描述
按所给的时间格式输出指定的时间
格式说明
对于 2014.09.05 13:14:20
yyyy: 年份,2014
yy: 年份,14
MM: 月份,补满两位,09
M: 月份, 9
dd: 日期,补满两位,05
d: 日期, 5
HH: 24制小时,补满两位,13
H: 24制小时,13
hh: 12制小时,补满两位,01
h: 12制小时,1
mm: 分钟,补满两位,14
m: 分钟,14
ss: 秒,补满两位,20
s: 秒,20
w: 星期,为 ['日', '一', '二', '三', '四', '五', '六'] 中的某一个,本 demo 结果为 五
输入
new Date(1409894060000), 'yyyy-MM-dd HH:mm:ss 星期w'
输出
2014-09-05 13:14:20 星期五
答案:

 

function formatDate(oDate, sFormation) {
    var obj = {
        yyyy:oDate.getFullYear(),
        yy:(""+ oDate.getFullYear()).slice(-2), //加" "将其转换为字符串,slice(-2)截掉空格 
        M:oDate.getMonth()+1,
        MM:("0"+ (oDate.getMonth()+1)).slice(-2),//加"0"将其转换为字符串,slice(-2)截掉字符"0"
        d:oDate.getDate(),
        dd:("0" + oDate.getDate()).slice(-2),
        H:oDate.getHours(),
        HH:("0" + oDate.getHours()).slice(-2),
        h:oDate.getHours() % 12,
        hh:("0"+oDate.getHours() % 12).slice(-2),
        m:oDate.getMinutes(),
        mm:("0" + oDate.getMinutes()).slice(-2),
        s:oDate.getSeconds(),
        ss:("0" + oDate.getSeconds()).slice(-2),
        w:['日', '一', '二', '三', '四', '五', '六'][oDate.getDay()]
    };
    return sFormation.replace(/([a-z]+)/ig,function($1){
        return obj[$1];
    });
}

 

9、题目描述
如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1
否则如果字符 Unicode 编码 > 255 则长度为 2
答案:

 

function strLength(s, bUnicode255For1) {
    if (bUnicode255For1) {
        return s.length;
    }else{
        var length=s.length;
        for(var i=0;i<length;i++){
            if (s.charCodeAt(i)>255) {
                length++;
            }
        }
        return length;
    }
}

 

说明:charCodeAt()方法是字符串的方法,参数为字符串中字符的索引,返回字符的编码值
10、题目描述
判断输入是否是正确的邮箱格式
输入描述:邮箱字符串
输出描述:true表示格式正确
答案:

 

function isAvailableEmail(sEmail) {
    var reg=/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
    return reg.test(sEmail)?true:false;
}

 

11、题目描述
将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入
输入
'rgb(255, 255, 255)'
输出
#ffffff
答案:

 

function rgb2hex(sRGB) {
    var reg=/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/;
    var result=sRGB.match(reg);
    var hex="#";
    if (result) {
        for(var i=1;i<=3;i++){
            hex+=parseInt(result[i]).toString(16);
        }
        return hex;
    }
    return sRGB;
}

 

说明:当匹配不成功时,match()返回null
parseInt()将字符串转换为数字,参数1:要转换的字符串;参数二:字符串的进制数
toString()将数字转换成字符串,参数为字符串的进制数
12、题目描述
css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能
1. 以 - 为分隔符,将第二个起的非空单词首字母转为大写
2. -webkit-border-image 转换后的结果为 webkitBorderImage
输入
'font-size'
输出
fontSize
答案:
①利用数组

 

function cssStyle2DomStyle(sName){
	var arr=sName.split("-");
	var i=0;
	if (arr[0]=="") {
		i=2;
	}else{
		i=1;
	}
	for(;i<arr.length;i++){
		var temp=arr[i].split("");
		temp[0]=temp[0].toUpperCase();
		arr[i]=temp.join(""); 
	}
	return arr.join("");
}

 

②利用正则

 

function cssStyle2DomStyle(sName) {
	var re = /-(\w)/g; 
	if(sName[0] == '-'){//如果字符串以 - 开头则将 - 删掉
		sName = sName.replace('-', '');
	}
	//将 “-字母”形式的字符串替换为 “大写字母”的形式 
	sName = sName.replace(re, function($0, $1){
		return $1.toUpperCase();
	});
	return sName;
}

 

③数组

 

function cssStyle2DomStyle(sName) {
	var arr = sName.split('');? 
	//判断第一个是不是 '-',是的话就删除 
	if(arr.indexOf('-') == 0){
		arr.splice(0,1);
	}
	//处理剩余的'-'
	for(var i=0; i<arr.length; i++){
		if(arr[i] == '-'){
			arr.splice(i,1);
			arr[i] = arr[i].toUpperCase();
		}
	}
	return arr.join('');
}

 

13、题目描述
统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率
1. 不限制 key 的顺序
2. 输入的字符串参数不会为空
3. 忽略空白字符
输入
'hello world'
输出
{h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1}

 

答案:

 

function count(str){
	if(!str||!str.length){
		return {};
	}
	var arr=str.replace(' ','').split('');
	var obj={};
	for(var i=0;i<arr.length;i++){
		if (!obj[arr[i]]) {
			obj[arr[i]]=1;
		}else{
			obj[arr[i]]++;
		}
	}
	return obj;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明致成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值