前端筆試題(一)

題目描述 一:

獲取 url 中的參數
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: {}}}}}

 

代碼:javascript

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 等

代碼:css

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
示例1

輸入

'hello world, 牛客', false

輸出

17

代碼:java

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(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

輸入

'font-size'

輸出

fontSize

代碼:web

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

輸入

'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 結果爲 五
示例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 星期一"
相關文章
相關標籤/搜索