亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

[ 題目練習(xí) ] 前端技能練習(xí)1

afishhhhh / 3179人閱讀

摘要:題目來源數(shù)組去重兩個循環(huán)思路新建一個新數(shù)組用于存放重復(fù)的數(shù)組元素,通過兩個循環(huán),比較兩個數(shù)組元素是否相同。設(shè)置或獲取與關(guān)聯(lián)的端口號碼。設(shè)置或獲取的協(xié)議部分。很容易看出規(guī)律,從第三個數(shù)字開始,每個數(shù)字等于前兩個數(shù)字之和。

  

題目來源:http://www.nowcoder.com/ta/front-end

1.數(shù)組去重

1.兩個循環(huán):

思路: 新建一個新數(shù)組用于存放重復(fù)的數(shù)組元素,通過兩個循環(huán),比較兩個數(shù)組元素是否相同。外循環(huán)控制第一個比較元素,內(nèi)循環(huán)控制第二個比較元素,如果有重復(fù)元素則將該元素添加到新數(shù)組中,最后返回這個新數(shù)組。
實現(xiàn):

Array.prototype.distinct = function() {
    var ret = [];
    for (var i = 0; i < this.length; i++)
    {
        for (var j = i+1; j < this.length;) {   
            if (this[i] === this[j]) {
                ret.push(this.splice(j, 1)[0]);
            } else {
                j++;
            }
        }
    }
     return ret;
};
//for test
alert(["a","b","c","d","b","a","e"].distinct());

2.一次循環(huán)

思路:創(chuàng)建一個空對象的和空數(shù)組,通過循環(huán),將原數(shù)組中的每個元素的值作為鍵值對添加到控對象中,如果這個對象中已經(jīng)存在該屬性,則說明這個數(shù)組元素是重復(fù)的,則將他添加到空數(shù)組中,最后返回新創(chuàng)建的數(shù)組。
實現(xiàn):

Array.prototype.distinct=function(){
    var arr=[];
    var obj={};
    for(var i=0;i

2.dom 節(jié)點查找

描述:查找兩個節(jié)點的最近的一個共同父節(jié)點,可以包括節(jié)點自身
思路:

有兩個dom的節(jié)點,dom1,dom2
1.判斷dom1節(jié)點是否包含dom2節(jié)點;包含則返回dom1,不包含繼續(xù)向下運行;
2.判斷dom2節(jié)點是否包含dom1節(jié)點;包含則返回dom2,不包含繼續(xù)向下運行;
3.通過其中一個節(jié)點dom1去獲取該節(jié)點的父節(jié)點,dom_p;
4.通過父節(jié)點dom_p去查dom_f的子節(jié)點,看dom2是否在父節(jié)點dom_f的子節(jié)點中;
5.如果dom2在dom_f的子節(jié)點中,則dom_f是最近的父節(jié)點;
6.如dom2不在dom_f的子節(jié)點中,則以domf_f繼續(xù)去查dom_f的父節(jié)點,重復(fù)1,2,3,4步驟最終得出父節(jié)點dom_f

實現(xiàn)1:

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

實現(xiàn)2:

function commonParentNode(oNode1, oNode2) {
    if(oNode2.contains(oNode1)) return oNode2;
    while(oNode1) {
        if(oNode1.contains(oNode2)){
            return oNode1;
        }
        oNode1 = oNode1.parentNode;
    }
}
3.URL相關(guān)

描述:

獲取 url 中的參數(shù)
1. 指定參數(shù)名稱,返回該參數(shù)的值 或者 空字符串
2. 不指定參數(shù)名稱,返回全部的參數(shù)對象 或者 {}
3. 如果存在多個同名參數(shù),則返回數(shù)組
輸入:
getUrlParam("http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe", "key")

輸出:
["1", "2", "3"]

實現(xiàn):

function getUrlParam(sUrl, sKey) {

    var r = [] , s = null  , i = 0;
    var regexp = new RegExp(/[?&]([w]*)=([^&#]*)/g);

    while((s = regexp.exec(sUrl)) != null){
        if(!r[s[1]])r[s[1]] = s[2];
        else if(typeof(r[s[1]]) == "object"){
            r[s[1]].push(s[2]);
        }else{
            r[s[1]] = [r[s[1]],s[2]];
        }
    }
    if(sKey){
        //有參數(shù),返回參數(shù)值或空
        if(r[sKey]){
            return r[sKey];
        }else{
            return "";
        }
    }else{
        return r;
    }
}

擴展:

1.window.location屬性相關(guān):

設(shè)置或獲取對象指定的文件名或路徑。
alert(window.location.pathname);

設(shè)置或獲取整個 URL 為字符串。
alert(window.location.href);

設(shè)置或獲取與 URL 關(guān)聯(lián)的端口號碼。
alert(window.location.port);

設(shè)置或獲取 URL 的協(xié)議部分。
alert(window.location.protocol);

設(shè)置或獲取 href 屬性中在井號“#”后面的分段。
alert(window.location.hash);

設(shè)置或獲取 location 或 URL 的 hostname 和 port 號碼。
alert(window.location.host);

設(shè)置或獲取 href 屬性中跟在問號后面的部分。
alert(window.location.search);

2.其他的獲取url參數(shù)的方法:

方式一:只能對固定url進(jìn)行操作,返回全部參數(shù)

function GetRequest() {
var url = location.search; //獲取url中"?"符后的字串
var theRequest = new Object();
if (url.indexOf("?") != -1) {
  var str = url.substr(1);
  strs = str.split("&");
  for(var i = 0; i < strs.length; i ++) {
     theRequest[strs[i].split("=")[0]]=(strs[i].split("=")[1]);
  }
}
 return theRequest;
}

方式二:正則表達(dá)式方式,只能對固定url操作,返回指定參數(shù)

function GetQueryString(name) {
   var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)","i");
   var r = window.location.search.substr(1).match(reg);
   if (r!=null) return (r[2]); return null;
}

方式三:對任意的url操作,返回指定數(shù)量的參數(shù)

function getUrlParames(url,keys){

    var request = {},
        result,
        parameStr = "",
        parames = [],
        keyValue = [],
        index = url.indexOf("?");

    if (index) {
        parameStr = url.substr(index+1);
        parames = parameStr.split("&");
        for(var i = 0, lng = parames.length; i < lng; i ++) {
            keyValue = parames[i].split("=");
            request[keyValue[0]] = keyValue[1];
      }
    }

    if (typeof keys == "string") {
        result = request[keys];
    }else if(!keys){
        return request;
    }
    else{

        result = {};
        for(var j = 0,lng = keys.length;j < lng;j++){
            result[keys[j]] = request[keys[j]];
        }
    }

    return result;
}
4:修改 this 指向

描述:
封裝函數(shù) f,使 fthis 指向指定的對象
輸入:bindThis(function(a, b){return this.test + a + b}, {test: 1})(2, 3)
輸出:6
思路:
我們可以觀察到
1.bindThis這個函數(shù)接受兩個參數(shù),第一個參數(shù)為執(zhí)行函數(shù),第二個參數(shù)是要指定的對象。
2.bindThis函數(shù)返回一個匿名函數(shù)

實現(xiàn):

function bindThis(f, oTarget) {
    return function(){
        var parames = Array.prototype.slice.call(arguments);
        return f.apply(oTarget,parames); //注意這里需要返回f的執(zhí)行結(jié)果
    }
}
5.根據(jù)包名,在指定空間中創(chuàng)建對象

描述:
根據(jù)包名,在指定空間中創(chuàng)建對象 :
輸入:namespace({a: {test: 1, b: 2}}, "a.b.c.d")
輸出:{a: {test: 1, b: {c: {d: {}}}}}

思路:
namespace函數(shù)的第一個參數(shù)是原始對象,第二個參數(shù)是需要創(chuàng)建的對象的包含關(guān)系。
通過輸出結(jié)果可以看出,如果第二個參數(shù)中的對象在原始對象中存在并且是它的值為一個對象則不做改變,若不為對象,則重新賦值為空對象{}.

實現(xiàn):

function namespace(oNamespace, sPackage) {

    var properties = sPackage.split(".");
    var parent = oNamespace;

    for (var i = 0, lng = properties.length; i < lng; ++i) {

        var property = properties[i];

        if (Object.prototype.toString.call(parent[property])!== "[object Object]") {
            parent[property] = {};
        }

        parent = parent[property];

    }

    return oNamespace;

}
6.斐波那契數(shù)列

描述:

什么是斐波那契數(shù)列:1,1,2,3,5....n 。很容易看出規(guī)律,從第三個數(shù)字開始,每個數(shù)字等于前兩個數(shù)字之和。

思路:

1.前兩個數(shù)字都為 1
2.使用遞歸

實現(xiàn):

function fibonacci(n) {
    if(n ==1 || n == 2){
        return 1
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}
7.時間格式化輸出

描述:

按所給的時間格式輸出指定的時間
格式說明
對于 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 結(jié)果為 五
輸入例子:
formatDate(new Date(1409894060000), "yyyy-MM-dd HH:mm:ss 星期w")

輸出例子:
2014-09-05 13:14:20 星期五

實現(xiàn):

function formatDate(oDate, sFormation) {
    var obj = {
        yyyy:oDate.getFullYear(),
        yy:(""+ oDate.getFullYear()).slice(-2),//非常精辟的方法
        M:oDate.getMonth()+1,
        MM:("0"+ (oDate.getMonth()+1)).slice(-2),
        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]});
}
8.獲取字符串的長度

描述:

如果第二個參數(shù) bUnicode255For1 === true,則所有字符長度為 1
否則如果字符 Unicode 編碼 > 255 則長度為 2
輸入例子:

strLength("hello world, ???, false)

輸出例子:
17

實現(xiàn):

function strLength(s, bUnicode255For1) {

    if(bUnicode255For1) return s.length;

    var length = s.length;
    for(var i = 0, lng = length; i < lng; i++){
        if(s.charCodeAt(i)>255){
            length ++;
        }
    }
    return length;
}
9.郵箱字符串判斷

描述:

判斷輸入是否是正確的郵箱格式
輸入: 郵箱字符串
輸出: true表示格式正確,false表示錯誤

實現(xiàn):

function isAvailableEmail(sEmail) {
    var parter = /^[a-z0-9_+.-]+@([a-z0-9-]+.)+[a-z0-9]{2,4}$/;
    return parter.test(sEmail);
}

這題的關(guān)鍵是理解這個正則表達(dá)式,我們拆開來看看:

1.^[a-z0-9_+.-]+ : 這個表示以一個或多個小寫字母,數(shù)字或_,+,.,-這幾個個字符開頭

2.@([a-z0-9-]+.)+ : 這個表示1中的字符連著@,后面再接著一個多個由小寫字母,數(shù)字,-字符和點.的組成的字符串。

3.[a-z0-9]{2,4}$ 這個比較簡單,表示以長度為2-4的,由小寫字母和數(shù)字任意組合組成的字符串結(jié)尾。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/85805.html

相關(guān)文章

  • 前端開發(fā)-從入門到Offer - 收藏集 - 掘金

    摘要:一些知識點有哪些方法方法前端從入門菜鳥到實踐老司機所需要的資料與指南合集前端掘金前端從入門菜鳥到實踐老司機所需要的資料與指南合集歸屬于筆者的前端入門與最佳實踐。 工欲善其事必先利其器-前端實習(xí)簡歷篇 - 掘金 有幸認(rèn)識很多在大廠工作的學(xué)長,在春招正式開始前為我提供很多內(nèi)部推薦的機會,非常感謝他們對我的幫助?,F(xiàn)在就要去北京了,對第一份正式的實習(xí)工作也充滿期待,也希望把自己遇到的一些問題和...

    sf_wangchong 評論0 收藏0
  • 前端該如何準(zhǔn)備數(shù)據(jù)結(jié)構(gòu)和算法?

    摘要:很多前端同學(xué)在看到數(shù)據(jù)結(jié)構(gòu)和算法后會有一定的抵觸心理,或者嘗試去練習(xí),但是被難倒,從而放棄。本文選擇的數(shù)據(jù)結(jié)構(gòu)和算法的類別均是出現(xiàn)頻率最高,以及應(yīng)用最廣的類別。面試這是非?,F(xiàn)實的一點,也是很多前端學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的原因。 一、導(dǎo)讀 據(jù)我了解,前端程序員有相當(dāng)一部分對數(shù)據(jù)結(jié)構(gòu)和算法的基礎(chǔ)概念都不是很清晰,這直接導(dǎo)致很多人在看到有關(guān)這部分的內(nèi)容就會望而卻步。 實際上,當(dāng)你了解了數(shù)據(jù)結(jié)構(gòu)和...

    simon_chen 評論0 收藏0
  • 進(jìn)攻即是最好的防御!19個練習(xí)黑客技術(shù)的在線網(wǎng)站

    摘要:進(jìn)攻即是最好的防御個練習(xí)黑客技術(shù)的在線網(wǎng)站進(jìn)攻即是最好的防御,這句話同樣適用于信息安全的世界。社區(qū)有接近萬的注冊會員也是最大的一個黑客社區(qū)之一。 進(jìn)攻即是最好的防御!19個練習(xí)黑客技術(shù)的在線網(wǎng)站 進(jìn)攻即是最好的防御,這句話同樣適用于信息安全的世界。這里羅列了19個合法的來練習(xí)黑客技術(shù)的網(wǎng)站,不管你是一名開發(fā)人員、安全工程師、代碼審計師、滲透測試人員,通過不斷的練習(xí)才能讓你成為一個優(yōu)秀安...

    tracy 評論0 收藏0
  • 大廠難進(jìn)?(來自雙非 非科班 應(yīng)屆生的自述信)

    摘要:關(guān)于自己屆畢業(yè)生一本雙非學(xué)校,非科班可能和很多人一樣,因為小時候喜歡打游戲,所以大學(xué)一直想學(xué)編程,但因為種種原因,自己來到了一個硬件相關(guān)專業(yè),但由于現(xiàn)實和興趣,自己又從事了軟件相關(guān)的工作。找實習(xí)實習(xí)對于之后的秋招來說,是非常非常重要的。 ...

    jerryloveemily 評論0 收藏1
  • 在線編程練習(xí)實踐網(wǎng)站

    摘要:在此收集一些自己遇到的一些在線練習(xí)的網(wǎng)站,當(dāng)然大部分是。建議邊學(xué)習(xí)邊編程,學(xué)習(xí)編程是不能光看不實踐的。國外的一個練習(xí)網(wǎng)站,有,也有,每種語言都有自己的道場,每個用戶都有不同的等級,刷題提高等級,也可以插卡別人優(yōu)秀的解決方案。 在學(xué)習(xí)的過程中會發(fā)現(xiàn)很多知識點如果不在工作中運用或者手寫帶驗證的話,很容易忘記。任何技能的掌握都是需要不斷練習(xí)的。在此收集一些自己遇到的一些在線練習(xí)的網(wǎng)站,當(dāng)然大...

    huhud 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<