题目描述 一:
获取 url 中的参数
1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定参数名称,返回全部的参数对象 或者 {}
3. 如果存在多个同名参数,则返回数组
1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定参数名称,返回全部的参数对象 或者 {}
3. 如果存在多个同名参数,则返回数组
示例1
输入
http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe
输出
[1, 2, 3]
代码:
function getUrlParam(sUrl, sKey) { var obj = {}; var index = sUrl.indexOf('?'); //url没有带参数 if(index==-1) { if(sKey==undefined){ return obj; }else{ return ""; } } var queryString = (sUrl.split("?")[1]).split("#")[0]; var query = queryString.split('&');//分离出了所有参数 for(var i=0;i<query.length;i++){ var keyValue = query[i].split("="); var key = keyValue[0]; var value = keyValue[1]; //console.log('key: '+key+" value: "+value); if(value ==""){ continue;//value值为空,进行下一次循环?为空就不进行统计了? } if(obj.hasOwnProperty(key)){//hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。如果有,返回true,否则返回false。 if(Array.isArray(obj[key])){//判断是不是数组 obj[key].push(value); }else{//不是数组 var val = obj[key]; obj[key] = []; obj[key].push(val);//?????有点蒙,这是为什么呀 obj[key].push(value);//这一段else里面的是真的不懂 } }else{//有新参数,直接添加 obj[key]=value; } } //console.log(obj) //1.指定参数名的,返回该参数的值或空 if(sKey){ return obj[sKey]?obj[sKey]:""; }else{ return obj; } }
题目描述二:
查找两个节点的最近的一个共同父节点,可以包括节点自身
输入描述:
oNode1 和 oNode2 在同一文档中,且不会为相同的节点
代码:
function commonParentNode(oNode1, oNode2) { if(isChildNode(oNode1,oNode2)){ return oNode2; } if(isChildNode(oNode2,oNode1)){ return oNode1; } var sameParentNode = oNode1.parentNode; while(sameParentNode!=document){ if(isChildNode(oNode2,sameParentNode)){ return sameParentNode; } sameParentNode = sameParentNode.parentNode; } return document; } function isChildNode(cNode,pNode){ var children = pNode.childNodes; for(var i=0;i<children.length;i++){ if(children[i].childNodes.length>0){ return isChildNode(cNode,children[i]); } if(cNode==children[i]){ return true; } } return false; }
题目描述三
根据包名,在指定空间中创建对象
输入描述:
namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
输出描述:
{a: {test: 1, b: {c: {d: {}}}}}
代码:
function namespace(oNamespace, sPackage) { var arr = sPackage.split('.'); var res = oNamespace; // 保留对原始对象的引用 for(var i = 0, len = arr.length; i < len; i++) { if(arr[i] in oNamespace) { // 空间名在对象中 if(typeof oNamespace[arr[i]] !== "object") { // 为原始值 oNamespace[arr[i]] = {}; // 将此属性设为空对象 } } else { // 空间名不在对象中,建立此空间名属性,赋值为空 oNamespace[arr[i]] = {}; } oNamespace = oNamespace[arr[i]]; // 将指针指向下一个空间名属性。 } return res; }
题目描述四:
为 Array 对象添加一个去除重复项的方法
示例1
输入
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
输出
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
Array.prototype.uniq = function () { var result = []; var flag = true; for(var i =0;i<this.length;i++) { if(result.indexOf(this[i])==-1) { if(this[i]!=this[i]) { if(flag) { result.push(this[i]); flag = false; } } else { result.push(this[i]); } } } return result; }
题目描述五:
用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等
代码:
function fibonacci(n) { var arr = []; arr[0] = 1; arr[1] = 1; for(var i = 2; i <= n ; i++) { arr[i] = arr[i - 1] + arr[i - 2]; } return arr[n - 1]; }
题目描述六
如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1
否则如果字符 Unicode 编码 > 255 则长度为 2
否则如果字符 Unicode 编码 > 255 则长度为 2
示例1
输入
'hello world, 牛客', false
输出
17
代码:
function strLength(s, bUnicode255For1) { if(bUnicode255For1){ return s.length; }else{ var len=s.length; for(var i=0;i<s.length;i++){ if(s.charCodeAt(i)>255){ len++; } } return len; } }
题目描述七:
判断输入是否是正确的邮箱格式
输入描述:
邮箱字符串
输出描述:
true表示格式正确
function isAvailableEmail(sEmail) { return /^(w+)(.w+)*@(w+)(.w+)*.(w+)$/i.test(sEmail); }
题目描述八:
将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入
1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入
示例1
输入
'rgb(255, 255, 255)'
输出
#ffffff
function rgb2hex(sRGB) { return sRGB.replace(/^rgb((d+)s*,s*(d+)s*,s*(d+))$/,function($0,$1,$2,$3){ return '#'+toHex($1)+toHex($2)+toHex($3); }); function toHex(str){ return ('0'+(+str).toString(16)).slice(-2); } }
题目描述九:
css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能
1. 以 - 为分隔符,将第二个起的非空单词首字母转为大写
2. -webkit-border-image 转换后的结果为 webkitBorderImage
1. 以 - 为分隔符,将第二个起的非空单词首字母转为大写
2. -webkit-border-image 转换后的结果为 webkitBorderImage
示例1
输入
'font-size'
输出
fontSize
代码:
function cssStyle2DomStyle(sName) { var result=sName.replace(/^-/,'').split('-'); for(var i=1;i<result.length;i++){ result[i]= result[i].replace(/^w/,function(e){ return e.toUpperCase(); }) } return result.join(''); }
题目描述十:
统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率
1. 不限制 key 的顺序
2. 输入的字符串参数不会为空
3. 忽略空白字符
1. 不限制 key 的顺序
2. 输入的字符串参数不会为空
3. 忽略空白字符
示例1
输入
'hello world'
输出
{h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1}
代码:
function count(str) { var count = {}; var str1 = str.match(/S/g) for(var i in str1) { if(count[str1[i]]){ count[str1[i]]++; } else{ count[str1[i]] = 1; } } return count; }
题目描述十一:
按所给的时间格式输出指定的时间
格式说明
对于 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 结果为 五
格式说明
对于 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 结果为 五
示例1
代码:
function formatDate(t, str) { var obj = { yyyy:t.getFullYear(), yy:(""+ t.getFullYear()).slice(-2), M:t.getMonth()+1, MM:("0"+ (t.getMonth()+1)).slice(-2), d:t.getDate(), dd:("0" + t.getDate()).slice(-2), H:t.getHours(), HH:("0" + t.getHours()).slice(-2), h:t.getHours() % 12, hh:("0"+t.getHours() % 12).slice(-2), m:t.getMinutes(), mm:("0" + t.getMinutes()).slice(-2), s:t.getSeconds(), ss:("0" + t.getSeconds()).slice(-2), w:['日', '一', '二', '三', '四', '五', '六'][t.getDay()] }; return str.replace(/([a-z]+)/ig,function($1){return obj[$1]}); } formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss 星期w') "2017-09-18 12:38:26 星期一"