最近在各大网站刷到的一些js的笔试题,都是自己已经调试测试过可行的代码。
整理非原创,只有核心注释是我自己写的,代码不是,仅作为笔记记录下来。阅读代码能力一般,如果出错的话请谅解,也欢迎指正。
(一)输入字符串,复制num次输出:
function times(str,num) {
return str.repeat(num);
}
console.log( times("ab",3));
测试数据ab,控制台输出ababab。
(二)原生js处理jsonp:
function myCallback(data) {
return console.log(data);
}
function jsonp(url, data, callback) {
if (typeof data == "string") {
callback = data;
data = {};
}
url += url.indexOf("?") != -1 ? "&" : "?";//若url中存在?则url =url+“&”,若不存在,url = url+“?”;
url += "callback=" + callback;
var parms = "";
for (var i in data) {
parms += "&" + i + "=" + data[i];//主要考察for in,此处的data是指 { id:88 },i指向id,data[i]为id的value,即88
}
url += parms;
var script = document.createElement("script");
script.setAttribute("src", url);
script.setAttribute("type","text/javascript");
document.querySelector("head").appendChild(script);
}
jsonp(
"http://www.baidu.com",
{ id:88},
"myCallback")
最终结果是http://baidu.com?callback=myCallback&id=34。
调试的时候控制台会报错Uncaught SyntaxError: Unexpected token <,点开错误会显示是百度的网页代码,然后开头<!doctype html>出现红色波浪线,这里不是代码有误,是服务器的原因。
(三)编写parse函数:
var object = {
b:{c:4},
d:[{e:5},{e:6}]
};
console.log(parse(object,"b.c") == 4);//true
console.log(parse(object,'d[0].e') == 5);//true
console.log(parse(object,"d.0.e") == 5);//true
console.log(parse(object,"d[1].e") == 6);//true
console.log(parse(object,"d.1.e") == 6);//true
console.log(parse(object,"f") == "undefined");//true
请编写相应的parse()函数。
然后比起动不动就很长的代码,我很偶然的看见了一段很惊艳的答案:
function parse(obj,str){
str.replace("[",".").replace("]",".").split(".").map((ele) => obj=obj[ele.trim()]);
return obj || "undefined";}
}
没错,出去开头和结尾,核心代码只有两行。
我看了一下,感觉思路是用“.”替代json数组中的两个中括号,在用split分割开。最后是一个箭头函数,使用map()将分割开的两部分装入新的数组,以角标为依据取值。
但是测试出来还是有瑕疵的,比如说:
console.log(parse(object,'d[0].e') == 5);
console.log(parse(object,"d[1].e") == 6);
这两句在Chrome里面运行出来,控制器报错会显示e未定义,但是d.0.e和d.1.e的那两句是不会报错,这里我不太明白是题目的问题还是答案的问题。