JavaScript 深拷貝/數(shù)組去重/......

1.JavaScript深拷貝

 function clone(obj) {
        var copy;

        // 處理3個簡單的類型, null 或者 undefined
        if (obj === null || typeof obj !== 'object') {
            return obj;
        }

        if (obj instanceof Date) {
            copy = new Date();
            copy.setTime(obj.getTime());
            return copy;
        }

        if (obj instanceof Array) {
            var copy = [];
            for (var i = 0, len = obj.length; i < len; i++) {
                copy[i] = clone(obj[i]);
            }
            return copy;
        }

        if (obj instanceof Object) {
            var copy = {};
            for (var attr in obj) {
                if (obj.hasOwnProperty(attr)) {
                    copy[attr] = clone(obj[attr]);
                }
            }
            return copy;
        }

        throw new Error("Unable to copy obj! Its type isn't supported.");
    }

2.數(shù)組去重

Array.prototype.unique1 = function()
{
    var n = []; //一個新的臨時數(shù)組
    for(var i = 0; i < this.length; i++) //遍歷當前數(shù)組
    {
        //如果當前數(shù)組的第i已經(jīng)保存進了臨時數(shù)組认臊,那么跳過愧膀,
        //否則把當前項push到臨時數(shù)組里面
        if (n.indexOf(this[i]) == -1) n.push(this[i]);
    }
    return n;
}
Array.prototype.unique2 = function()
{
    var n = {},r=[]; //n為hash表馆类,r為臨時數(shù)組
    for(var i = 0; i < this.length; i++) //遍歷當前數(shù)組
    {
        if (!n[this[i]]) //如果hash表中沒有當前項
        {
            n[this[i]] = true; //存入hash表
            r.push(this[i]); //把當前數(shù)組的當前項push到臨時數(shù)組里面
        }
    }
    return r;
}
Array.prototype.unique3 = function()
{
    var n = [this[0]]; //結(jié)果數(shù)組
    for(var i = 1; i < this.length; i++) //從第二項開始遍歷
    {
        //如果當前數(shù)組的第i項在當前數(shù)組中第一次出現(xiàn)的位置不是i歼培,
        //那么表示第i項是重復(fù)的亩码,忽略掉季率。否則存入結(jié)果數(shù)組
        if (this.indexOf(this[i]) == i) n.push(this[i]);
    }
    return n;
}

其中第1種和第3種方法都用到了數(shù)組的indexOf方法。

  • 此方法的目的是尋找存入?yún)?shù)在數(shù)組中第一次出現(xiàn)的位置描沟。很顯 然飒泻,js引擎在實現(xiàn)這個方法的時候會遍歷數(shù)組直到找到目標為止。所 以此函數(shù)會浪費掉很多時間吏廉。
    而第2中方法用的是hash表泞遗。把已經(jīng)出現(xiàn)過的通過下標的形式存入一個object內(nèi)。下標的引用要比用indexOf搜索數(shù)組快的多席覆。
Array.prototype.unique4 = function()
{
    this.sort();
    var re=[this[0]];
    for(var i = 1; i < this.length; i++)
    {
        if( this[i] !== re[re.length-1])
        {
            re.push(this[i]);
        }
    }
    return re;
}

 * 這個方法的思路是先把數(shù)組排序史辙,然后比較相鄰的兩個值。 
 * 排序的時候用的JS原生的sort方法佩伤,JS引擎內(nèi)部應(yīng)該是用的快速排序吧聊倔。
 * 最終測試的結(jié)果是此方法運行時間平均是第二種方法的三倍左右,不過比第一種和第三種方法快了不少生巡。

3.Vue/React組件聲明周期

beforecreate : 舉個栗子:可以在這加個loading事件
created :在這結(jié)束loading耙蔑,還做一些初始化,實現(xiàn)函數(shù)自執(zhí)行
mounted: 在這發(fā)起后端請求孤荣,拿回數(shù)據(jù)纵潦,配合路由鉤子做一些事情

beforeDestory: 你確認刪除XX嗎? destoryed :當前組件已被刪除垃环,清空相關(guān)內(nèi)容
當然邀层,還有更多,繼續(xù)探索中……

原文

4.CSS垂直居中

水平垂直居中一

 如果確定容器的寬高 寬500 高 300  
 利用 負margin
 設(shè)置層的外邊距

 div {
    position: relative;     /* 相對定位或絕對定位均可 */
    width:500px;
    height:300px;
    top: 50%;
    left: 50%;
    margin: -150px 0 0 -250px;      /* 外邊距為自身寬高的一半 */

  }
水平垂直居中二

 未知容器的寬高遂庄,利用 `transform` 屬性

 div {
    position: absolute;     /* 相對定位或絕對定位均可 */
    width:500px;
    height:300px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: pink;     /* 方便看效果 */

 }
水平垂直居中三
      利用 flex 布局
      實際使用時應(yīng)考慮兼容性


 .container {
    display: flex;
    align-items: center;        /* 垂直居中 */
    justify-content: center;    /* 水平居中 */

 }
 .container div {
    width: 100px;
    height: 100px;
    background-color: pink;     /* 方便看效果 */
 }  

5.JavaScript 排序算法

冒泡排序



    //自己寫
    var bubble = function(array) {
        for (var j = 0; j < array.length; j++) {
            for (var i = 0; i < array.length; i++) {
                if (array[i] > array[i + 1]) {
                    var temp = array[i];
                    array[i] = array[i + 1];
                    array[i + 1] = temp;
                }
            }
        }
        return array;
    }
    //網(wǎng)上示例
    var bubbleSort=function(arr){
        for(var i=0;i<arr.length-1;i++){
            for(var j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j]){//如果前面的數(shù)據(jù)比后面的大就交換
                    var temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        return arr;
    }
//    console.log("The result is:"+bubbleSort(arr));

插入排序

var quickSort=function(arr){   
        //如果數(shù)組長度小于等于1無需判斷直接返回即可  
        if(arr.length<=1){  
            return arr;  
        }  
        
        var midIndex=Math.floor(arr.length/2);//取基準點  
        var midIndexVal=arr.splice(midIndex,1);//取基準點的值,splice(index,1)函數(shù)可以返回數(shù)組中被刪除的那個數(shù)arr[index+1]  
        var left=[];//存放比基準點小的數(shù)組  
        var right=[];//存放比基準點大的數(shù)組  
        //遍歷數(shù)組寥院,進行判斷分配  
        for(var i=0;i<arr.length;i++){  
            if(arr[i]<midIndexVal){  
                left.push(arr[i]);//比基準點小的放在左邊數(shù)組  
            }  
            else{  
                right.push(arr[i]);//比基準點大的放在右邊數(shù)組  
            }  
            
        }  
        //遞歸執(zhí)行以上操作,對左右兩個數(shù)組進行操作,直到數(shù)組長度為<=1涛目;  
        return quickSort(left).concat(midIndexVal,quickSort(right));  
};  
  1. v-if和v-show

關(guān)于條件渲染

  • 所謂條件渲染秸谢,就是根據(jù)不同的條件凛澎,使用不同的模板來生成 html。 在 Vue.js 中估蹄,使用 v-if 和 v-show 指令來控制條件渲染塑煎。
區(qū)別

   v-show 會在app初始化的時候編譯并且渲染,并且在之后一直存在臭蚁。
當切換v-show模塊時最铁,只是簡單的更改css。
   v-if 當切換v-if模塊時垮兑,Vue.js 有一個局部編譯/卸載過程冷尉,因為 v-if 之中的模板也可能包括
數(shù)據(jù)綁定或子組件。v-if 是真實的條件渲染系枪,因為它會確保條件塊在切換當中合適地銷毀與重建條件
塊內(nèi)的事件監(jiān)聽器和子組件雀哨。 v-if 是惰性的,如果為false私爷,則什么也不錯-不編譯雾棺,不渲染。 
  當?shù)谝淮螚l件為真時衬浑,才開始編譯捌浩。

建議

v-show的切換消耗比較低,但是不會重新渲染子組件嚎卫,所以最好用于靜態(tài)的內(nèi)容或者不需要重新構(gòu)建結(jié)構(gòu)的組件嘉栓。
  而 v-if 比較適合不太頻繁的切換狀態(tài)的組件宏榕。所以項目設(shè)計的時候拓诸,不要對復(fù)雜的業(yè)務(wù)設(shè)計模塊太頻繁的視圖切換。盡量將靜態(tài)內(nèi)容和動態(tài)內(nèi)容分離到不同的模塊中麻昼。

在切換 v-if 塊時奠支,Vue.js 有一個局部編譯/卸載過程,因為 v-if 之中的模板也可能包括數(shù)據(jù)綁定或子組件抚芦。
  v-if 是真實的條件渲染倍谜,因為它會確保條件塊在切換當中合適地銷毀與重建條件塊內(nèi)的事件監(jiān)聽器和子組件。
v-if 也是惰性的:如果在初始渲染時條件為假叉抡,則什么也不做——在條件第一次變?yōu)檎鏁r才開始局部編譯(編譯會被緩存起來)尔崔。
相比之下,v-show 簡單得多——元素始終被編譯并保留褥民,只是簡單地基于 CSS 切換季春。
一般來說,v-if 有更高的切換消耗而 v-show 有更高的初始渲染消耗消返。因此载弄,如果需要頻繁切換 v-show 較好耘拇,如果在運行時條件不大可能改變 v-if 較好

閉包

閉包就是函數(shù)能夠記住并訪問它的詞法作用域,即使當這個函數(shù)在它的詞法作用域之外執(zhí)行時宇攻。


一個頁面從輸入 URL 到頁面加載顯示完成惫叛,這個過程中都發(fā)生了什么?

1.瀏覽器會開啟一個新的線程來處理這個請求逞刷,對 URL 分析判斷如果是 http 協(xié)議就按照 Web 方式來處理;
2.通過 DNS 解析獲取網(wǎng)址的IP地址嘉涌,設(shè)置 UA 等信息發(fā)出第二個GET請求;
3.進行 HTTP 協(xié)議會話,客戶端發(fā)送報頭(請求報頭);
4.進入到 web 服務(wù)器上的 Web Server亲桥,如 Apache洛心、Tomcat、Node.JS 等服務(wù)器;
5.進入部署好的后端應(yīng)用题篷,如 PHP词身、Java、JavaScript番枚、Python 等法严,找到對應(yīng)的請求處理;
6.處理結(jié)束回饋報頭,和資源葫笼,如果是瀏覽器訪問過的資源深啤,瀏覽器緩存上有對應(yīng)的,會與服務(wù)器最后修改時間對比路星,一致則返回304;
7.如果 html 沒緩存溯街,則瀏覽器開始下載 html 文檔(響應(yīng)報頭,狀態(tài)碼200)洋丐,同時使用緩存;
8.html 一邊下載一邊解析 html呈昔,根據(jù)標簽建立文檔樹 DOM
9.其中根據(jù)標記下載所需css、js友绝、圖片文件堤尾,其中 css 是異步下載,同步執(zhí)行(By default CSS is treated as a render blocking resource, html 也是)并會阻塞式的建立 CSSOM, 然后這倆一起會 render 成完整的 render 樹(最后我們看到的樣子)迁客,然后再因為假如把 css 放到底部,可能頁面會出現(xiàn)白屏(阻塞 render)郭宝,或者布局混亂樣式很丑直到CSS加載完成閃跳(rerender)的感覺。所以寫到頂部確保用戶至少能早一點看到界面掷漱。
10.js 在現(xiàn)代瀏覽器里面是異步下載粘室,同步執(zhí)行的,最好放到底部卜范。因為對于在 js 后面的內(nèi)容(html)衔统,html 的逐步呈現(xiàn)會被阻塞。
11.當 js 運行完成,頁面加載完成缰冤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犬缨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棉浸,更是在濱河造成了極大的恐慌怀薛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迷郑,死亡現(xiàn)場離奇詭異枝恋,居然都是意外死亡,警方通過查閱死者的電腦和手機嗡害,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門焚碌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霸妹,你說我怎么就攤上這事十电。” “怎么了叹螟?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵鹃骂,是天一觀的道長。 經(jīng)常有香客問我罢绽,道長畏线,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任良价,我火速辦了婚禮寝殴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘明垢。我一直安慰自己蚣常,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布袖外。 她就那樣靜靜地躺著史隆,像睡著了一般魂务。 火紅的嫁衣襯著肌膚如雪曼验。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天粘姜,我揣著相機與錄音鬓照,去河邊找鬼。 笑死孤紧,一個胖子當著我的面吹牛豺裆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼臭猜,長吁一口氣:“原來是場噩夢啊……” “哼躺酒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蔑歌,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤羹应,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后次屠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體园匹,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年劫灶,在試婚紗的時候發(fā)現(xiàn)自己被綠了裸违。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡本昏,死狀恐怖供汛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涌穆,我是刑警寧澤紊馏,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蒲犬,受9級特大地震影響朱监,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜原叮,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一赫编、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奋隶,春花似錦擂送、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至境氢,卻和暖如春蟀拷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萍聊。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工问芬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寿桨。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓此衅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挡鞍,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容