初級前端需要知道的基礎知識

前言:本文會羅列出十道比較基礎的題目访递,我個人作為剛入門的初級前端晦嵌,寫這篇文章正好可以總結匯總一下近期的知識,看到這篇文章的朋友也可以看看這十道題你是否都能正確的、完整的答出來惭载。我個人會總結出答案放于文后旱函,歡迎討論。


題目詳情:

1描滔、請寫出一個符合 W3C 規(guī)范的 HTML 文件棒妨,要求如下:

  1. 頁面標題為「我的頁面」
  2. 頁面中引入了一個外部 CSS 文件,文件路徑為 /style.css
  3. 頁面中引入了另一個外部 CSS 文件含长,路徑為 /print.css券腔,該文件僅在打印時生效
  4. 頁面中引入了另一個外部 CSS 文件,路徑為 /mobile.css茎芋,該文件僅在設備寬度小于 500 像素時生效
  5. 頁面中引入了一個外部 JS 文件颅眶,路徑為 /main.js
  6. 頁面中引入了一個外部 JS 文件,路徑為 /gbk.js田弥,文件編碼為 GBK
  7. 頁面中有一個 SVG 標簽涛酗,SVG 里面有一個直徑為 100 像素的圓圈,顏色隨意
  8. 注意題目中的路徑

2偷厦、 移動端是怎么做適配的商叹?

注:回答要點:

  1. meta viewport
  2. 媒體查詢
  3. 動態(tài) rem 方案

3、用過CSS3嗎? 實現(xiàn)圓角矩形和陰影怎么做?

4只泼、什么是閉包剖笙,閉包的用途是什么?

5请唱、函數(shù)中call弥咪、applybind 的用法分別是什么十绑?

6聚至、請說出至少 8 個 HTTP 狀態(tài)碼,并描述各狀態(tài)碼的意義本橙。

7扳躬、請寫出一個 HTTP post 請求的內容,包括四部分甚亭。

其中
第四部分的內容是 username=ff&password=123
第二部分必須含有 Content-Type 字段
請求的路徑為 /path

8贷币、請說出至少三種排序的思路,這三種排序的時間復雜度分別為

  1. O(n*n)
  2. O(n log2 n)
  3. O(n + max)

9亏狰、一個頁面從輸入 URL 到頁面加載顯示完成役纹,這個過程中都發(fā)生了什么?

10暇唾、如何實現(xiàn)數(shù)組去重字管?

假設有數(shù)組 array = [1,5,2,3,4,2,3,1,3,4]
你要寫一個函數(shù) unique啰挪,使得
unique(array) 的值為 [1,5,2,3,4]
也就是把重復的值都去掉,只保留不重復的值嘲叔。

要求:

  1. 不要做多重循環(huán),只能遍歷一次
  2. 請給出兩種方案抽活,一種能在 ES 5 環(huán)境中運行硫戈,一種能在 ES 6 環(huán)境中運行(提示 ES 6 環(huán)境多了一個 Set 對象)

參考答案

注:答案為我個人總結而得,僅供參考下硕,歡迎討論丁逝。


No.1 HTML基本格式 & 媒體查詢 & <svg> & 文件編碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我的頁面</title>
    <link rel="stylesheet" href="./style.css">
    <link rel="stylesheet" href="./print.css" media="print">
    <link rel="stylesheet" href="./mobile.css" media="(max-width:500px)">
</head>
<body>
    <svg>
        <circle cx="50" cy="50" r="50" fill="red"/>
    </svg>
    <script src="./main.js"></script>
    <script src="./gbk.js" charset="gbk"></script>
</body>
</html>
  • 媒體查詢詳見下一題。
  • 關于文件編碼梭姓,一般情況下都是后端來設置霜幼,但是為了以防萬一,我們可以在引入如css誉尖,js文件時罪既,順便也設置一下引入文件的文件編碼保證不會出錯。
    舉例說明:<script src="./gbk.js" charset="gbk"></script>
  • 關于<svg>铡恕,詳情可以看MDN文檔琢感,這里僅對題目要求進行解釋:
    <svg>中,畫圓使用<circle>標簽探熔,其中cx驹针、cy屬性指的是圓心的坐標,r指的是圓的半徑诀艰,需要注意的是柬甥,svg填充顏色用的是fill屬性。

No.2 移動端適配:meta viewport & 媒體查詢 & 動態(tài)rem

關于meta viewport 和 媒體查詢詳情可參考這篇博客
關于動態(tài)rem詳情可參考這篇博客

移動端的適配有以下要點:

  • 首先必須使用這么一行代碼來禁止手機自動縮放頁面:
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 其垄,
    其中width=device-width意思是頁面寬度等于設備寬度苛蒲、 user-scalable=no 禁止用戶縮放頁面、initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">即原始縮放比例捉捅,最大縮放比例撤防,最小縮放比例都是1.0

  • 使用 media 查詢來響應不同分辨率
    如在引入外部樣式時,只有滿足條件最大寬度為800px時棒口,example.css才生效:
    <link rel="stylesheet" media="(max-width: 800px)" href="example.css" />
    在CSS內部寄月,也可以用media來設置特定的情況下讓某些樣式生效,如下无牵,即當最大寬度為600px時漾肮,該樣式生效:

<style>
  @media (max-width: 600px) {
     ……
  }
</style>
  • 使用動態(tài) REM 方案保證手機端的顯示效果
    rem指的是根元素的字體大小,根元素一般指的是<html>
    動態(tài)rem即在js中設置
var pageWidth = window.innerWidth
 document.write('<style>html{font-size:'+pageWidth/10+'px;}</style>')

讓1rem=0.1設備寬度茎毁,然后所有的css寬高使用rem為單位即可克懊。
使用scss可以自動讓px轉化為rem:

@function px( $px ){
  @return $px/$designWidth*10 + rem;
}
$designWidth : 640; // 640 是設計稿的寬度忱辅,你要根據(jù)設計稿的寬度填寫。

No.3 CSS3 & 圓角矩形 & 陰影

  • CSS3 MDN文檔
    css3 中的新特性谭溉,比較常用的:
    新增加的偽類如nth-child()等墙懂、flex布局、使用transform對元素進行變換扮念、transition過度损搬,通過定義keyframes做一些動畫效果、添加陰影box-shadow柜与、移動端適配中會用到媒體查詢等巧勤。
  • border-radious 文檔
    • 后面接一個值時:為元素的四個角都設置相同的圓角;
    • 后面接兩個值:第一個值設置的是左上角和右下角的值弄匕,第二個值指的是右上角和左下角的值颅悉;
    • 后面接四個值時:四個值分別設置的圓角順序為,從左上角開始順時針的四個角迁匠,即分別為左上角剩瓶,右上角,右下角柒瓣,左下角儒搭。
    • 如果我們要做一個圓形,可以這么寫:border-radious:50%;
    • 使用圓角還可以做橢圓:border-radius還可以用斜杠設置第二組值芙贫。這時搂鲫,第一組值表示水平半徑,第二組值表示垂直半徑磺平。第二組值也可以同時設置1到4個值魂仍,應用規(guī)則與第一組值相同。如:border-radius: 15px 5px 25px 5px / 3px 5px 10px 15px;
  • box-shadow 文檔
    box-shadow 可以使用一個或多個投影拣挪,如果使用多個投影時必須需要用逗號“擦酌,”分開。用法如下:
    對象選擇器 {box-shadow:inset x-offset y-offset blur-radius spread-radius color}
    對象選擇器 {box-shadow:投影方式 X軸偏移量 Y軸偏移量 陰影模糊半徑 陰影擴展半徑 陰影顏色}

No.4 閉包

  • 閉包的定義:如果一個函數(shù)使用了它范圍外的變量菠劝,那么(這個函數(shù)和這個變量)就叫做閉包赊舶。舉個例子:
function foo(){
  var local = 1
  function bar(){
    local++
    return local
  }
  return bar
}

var func = foo()
func()

上述代碼中,變量local和函數(shù)bar合稱為閉包赶诊,即在函數(shù)bar中使用了函數(shù)外定義的變量local笼平。

  • 閉包的用途:我們之所以使用閉包,是應為閉包可以用來「間接訪問一個變量」舔痪。換句話說寓调,「隱藏一個變量」。
    舉個例子:
!function(){

  var lives = 50

  window.addLives = function(){
    lives += 1
  }

  window.reduceLives = function(){
    lives -= 1
  }

}()

上述代碼中锄码,變量lives為局部變量夺英,該立即函數(shù)的外面是無法直接訪問該變量的晌涕,在該立即執(zhí)行函數(shù)內部,聲明了addLives函數(shù)和reduceLives函數(shù)痛悯,由此我們可以在函數(shù)外部通過調用這兩個函數(shù)來間接地調用lives這個變量余黎。這就是閉包的意義所在。

總結:閉包的用處:

  1. 可以間接調用函數(shù)內部的局部變量灸蟆。
  2. 可以讓這些變量的值始終保持在內存中驯耻。
  3. 可以暫存數(shù)據(jù),給變量開辟私密空間,避免外部污染

No.5 call & apply & bind 的用法

參考博客

在 javascript 中,call 和 apply 都是為了改變某個函數(shù)運行時的上下文(context)而存在的炒考,換句話說,就是為了改變函數(shù)體內部 this 的指向霎迫。

  • call() 方法調用一個函數(shù), 其具有一個指定的this值和分別地提供的參數(shù)(參數(shù)的列表)斋枢。

  • apply() 方法調用一個函數(shù), 其具有一個指定的this值,以及作為一個數(shù)組(或類似數(shù)組的對象)提供的參數(shù)知给。

  • bind() 方法創(chuàng)建一個新的函數(shù)瓤帚,被調用時,將其this關鍵字設置為提供的值涩赢,在調用新函數(shù)時,在任何提供之前提供一個給定的參數(shù)序列。

  • 對于apply栈雳、call二者而言鸠踪,作用完全一樣,只是接受參數(shù)的方式不太一樣花墩,call需要把參數(shù)按順序傳遞進去悬秉,而 apply則是把參數(shù)放在數(shù)組里

  • apply 冰蘑、call和泌、bind三者都是用來改變函數(shù)的this對象的指向的;
    apply祠肥、 call武氓、bind 三者第一個參數(shù)都是this要指向的對象,也就是想指定的上下文仇箱;
    apply县恕、 callbind三者都可以利用后續(xù)參數(shù)傳參工碾;
    bind 是返回對應函數(shù)弱睦,便于稍后調用;apply 渊额、call則是立即調用 况木。

舉例說明:

var obj = {
    x: 81,
};
 
var foo = {
    getX: function() {
        return this.x;
    }
}
 
console.log(foo.getX.bind(obj)());  //81
console.log(foo.getX.call(obj));    //81
console.log(foo.getX.apply(obj));   //81

// 三個輸出的都是81垒拢,但是注意看使用 bind() 方法的,他后面多了對括號火惊。
//也就是說求类,區(qū)別是,當你希望改變上下文環(huán)境之后并非立即執(zhí)行屹耐,而是回調執(zhí)行的時候尸疆,使用 bind() 方法。而 apply/call 則會立即執(zhí)行函數(shù)惶岭。

No.6 HTTP 狀態(tài)碼

HTTP狀態(tài)碼 維基百科
一篇更形象的介紹狀態(tài)碼的博客

下面列舉一些比較常見的狀態(tài)碼

  • 1xx消息:代表請求已被接受寿弱,需要繼續(xù)處理。這類響應是臨時響應按灶,只包含狀態(tài)行和某些可選的響應頭信息症革,并以空行結束。(不常用鸯旁,大致知道即可)

2XX:表示成功

  • 200 OK:請求已成功噪矛,請求所希望的響應頭或數(shù)據(jù)體將隨此響應返回。
  • 204 No Content:表示請求已成功處理铺罢,但是沒有內容返回艇挨,意思等同于請求執(zhí)行成功,但是沒有數(shù)據(jù)韭赘,瀏覽器不用刷新頁面缩滨,也不用導向新的頁面。
  • 206 Partial Content:服務器已經(jīng)成功處理了部分GET請求辞居。(客戶端進行了范圍請求) 響應報文中包含Content-Range指定范圍的實體內容楷怒。

3XX:重定向

  • 301 Moved Permanently:表示訪問的資源被永久移除,即請求的資源已經(jīng)永久的搬到了其他位置 瓦灶。
  • 302 Found :表示所訪問的資源臨時被移除鸠删,以后還會回來,即臨時重定向贼陶,表示請求的資源臨時搬到了其他位置 刃泡。
  • 303 See Other :表示請求資源存在另一個URI,應使用GET定向獲取請求資源 碉怔。
  • 304 Not Modified :表示資源未被修改烘贴,即客戶端仍然具有以前下載的副本,不需要重新傳輸資源撮胧。
  • 307 Temporary Redirect:臨時重定向桨踪,和302有著相同含義 ,盡管302標準禁止POST變?yōu)镚ET芹啥,但沒人聽他的 锻离,而307就會遵照標準铺峭,不會從POST變?yōu)镚ET
    但處理響應行為,各個瀏覽器可能不同汽纠。

4XX:客戶端錯誤

  • 400 Bad Request:表示請求報文存在語法錯誤或參數(shù)錯誤卫键,服務器不理解 ,服務器不應該重復提交這個請求 虱朵,需要修改請求內容后再次發(fā)送莉炉。
  • 401 Unauthorized:表示發(fā)送的請求需要有HTTP認證信息或者是認證失敗了 ,返回401的響應必須包含一個適用于被請求資源的WWW-Authenticate首部以質詢用戶信息 碴犬,瀏覽器初次接受401時絮宁,會彈出認證窗口。
  • 403 Forbidden :表示對請求資源的訪問被服務器拒絕了 服协,服務器可以對此作出解釋羞福,也可以不解釋 ,想說明的話可以在響應實體的主體部分描述原因 蚯涮。比如說你可能沒有訪問權限。
  • 404 Not Found:表示服務器找不到你請求的資源 卖陵,但允許用戶的后續(xù)請求遭顶。

5XX:服務器錯誤

  • 500 Internal Server Error:通用錯誤消息,服務器遇到了一個未曾預料的狀況泪蔫,導致了它無法完成對請求的處理棒旗。沒有給出具體錯誤信息。
  • 502 Bad Gateway:作為網(wǎng)關或者代理工作的服務器嘗試執(zhí)行請求時撩荣,從上游服務器接收到無效的響應铣揉。
  • 503 Service Unavailable:表示服務器超負載或正停機維護,無法處理請求 餐曹,如果服務器知道還需要多長時間逛拱,就寫入Retry-After首部字段返回。

No.7 HTTP post 請求

具體格式台猴,參照博客
參考答案:

POST /path HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded

username=ff&password=123

注意:第二部分一般都要有Host朽合、Content-LengthContent-Type


No.8 排序算法

排序算法維基百科 饱狂,很多前端對算法的了解都很淺曹步,但在面試中大多時候都會考察一些算法的知識,所以最基本的排序算法我們還是應該大致了解一下的休讳。下面大概提幾個常見的排序算法思路讲婚。注:這個網(wǎng)站提供了常見排序算法的動態(tài)展示效果。

  • 冒泡排序俊柔,時間復雜度O(n^2):
    遍歷整個數(shù)組筹麸,比較每相鄰兩個元素活合,將小的排在前面,大的排后面竹捉,這樣就可以得到最大的元素芜辕,遍歷除了已經(jīng)排序過的在最后的最大值,重復以上操作块差。
  • 選擇排序侵续,時間復雜度O(n^2):
    遍歷整個數(shù)組,選擇一個最小的數(shù)字放在第一位憨闰,然后遍歷剩下的數(shù)字状蜗,在剩下的數(shù)字中選擇最小的放在第二位,以此類推鹉动。
  • 插入排序轧坎,時間復雜度O(n^2):
    先排好前兩個數(shù)字的順序,從第三個數(shù)字開始泽示,與已經(jīng)排好的數(shù)字對比缸血,將其插入到對應的位置,以此類推
  • 歸并排序械筛,時間復雜度O(nlog n):
    把數(shù)據(jù)分為兩段捎泻,從兩段中逐個選最小的元素移入新數(shù)據(jù)段的末尾。
  • 快速排序埋哟,時間復雜度O(nlog n):
    找其中的一個數(shù)作為標桿,小于標桿的數(shù)字放在左邊,大于標桿的數(shù)字放在右邊,這一次排完之后再重復前面的操作,直到只有一個數(shù)字為止
  • 計數(shù)排序笆豁,時間復雜度O(n + max):
    統(tǒng)計小于等于該元素值的元素的個數(shù)i,于是該元素就放在目標數(shù)組的索引i位
  • 桶排序赤赊,時間復雜度O(n):
    將值為i的元素放入i號桶闯狱,最后依次把桶里的元素倒出來。
  • 基數(shù)排序抛计,時間復雜度O(K × n):
    創(chuàng)建10個桶哄孤,給每個數(shù)位(0到9),從個位數(shù)開始遍歷數(shù)列中的每個元素的數(shù)位爷辱,把每個元素按照隊列排列到對應數(shù)位的桶中录豺,再從隊列中恢復至數(shù)列,再遍歷十位數(shù)饭弓,重復以上操作双饥,直到遍歷到最大元素的位數(shù)。
  • 堆排序弟断,時間復雜度O(nlogn):
    1咏花、將已知數(shù)組看成一個完全二叉樹;
    2、從二叉樹最后一層最右邊開始遍歷(即數(shù)組的最后一個數(shù))昏翰;
    3苍匆、進行最大堆調整,使得最頂層的數(shù)成為數(shù)組中最大的數(shù)棚菊;
    4浸踩、將最頂層的數(shù)與最后一層最右邊的數(shù)調換位置,并使最大數(shù)不再參與下一次最大堆調整统求;
    5检碗、因最頂層的元素改變,從第二層開始進行最大堆調整码邻,第二次最大堆調整使得數(shù)組中第二大的數(shù)字變換到最頂層折剃;
    6、最頂層的數(shù)與最后一層最右邊的數(shù)換位并不再參與下一次最大堆調整像屋;
    7怕犁、重復5、6的步驟直至確定數(shù)組中所有數(shù)的位置己莺;
    8奏甫、輸出重新排序后的數(shù)組

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

這是一道很經(jīng)典的前端面試題凌受,網(wǎng)上有各種各樣的資料扶檐,總體來說這一題是考察你的知識邊界,這里只大概的說一下相關的過程(不夠全面)胁艰。
參考博客:這篇博客寫的非常全面,從敲擊鍵盤開始講起智蝠,包含了很多硬件知識以及操作系統(tǒng)腾么、內存等,我本人目前知識有限杈湾,無法介紹的那么詳細解虱,有興趣的可以點擊上面的鏈接查看。

總體來說分為以下幾個過程:

  1. DNS解析:
    DNS解析的過程就是尋找哪臺機器上有你需要資源的過程漆撞。當你在瀏覽器中輸入一個地址時殴泰,例如www.baidu.com,其實不是百度網(wǎng)站真正意義上的地址浮驳『费矗互聯(lián)網(wǎng)上每一臺計算機的唯一標識是它的IP地址,但是IP地址并不方便記憶至会。用戶更喜歡用方便記憶的網(wǎng)址去尋找互聯(lián)網(wǎng)上的其它計算機离咐,也就是上面提到的百度的網(wǎng)址。所以互聯(lián)網(wǎng)設計者需要在用戶的方便性與可用性方面做一個權衡,這個權衡就是一個網(wǎng)址到IP地址的轉換宵蛀,這個過程就是DNS解析昆著。它實際上充當了一個翻譯的角色,實現(xiàn)了網(wǎng)址到IP地址的轉換术陶。
  2. TCP連接:
    知道了服務器的 IP 地址凑懂,下面便開始與服務器建立連接了。
    通俗地講梧宫,通信連接的建立需要經(jīng)歷以下三個過程:
    (1)主機向服務器發(fā)送一個建立連接的請求(您好接谨,我想認識您);
    (2)服務器接到請求后發(fā)送同意連接的信號(好的祟敛,很高興認識您)疤坝;
    (3)主機接到同意連接的信號后,再次向服務器發(fā)送了確認信號(我也很高興認識您)馆铁,自此跑揉,主機與服務器兩者建立了連接。
  3. 發(fā)送HTTP請求
    發(fā)送HTTP請求的過程就是構建HTTP請求報文并通過TCP協(xié)議中發(fā)送到服務器指定端口(HTTP協(xié)議80/8080, HTTPS協(xié)議443)埠巨。HTTP請求報文是由三部分組成: 請求行, 請求報頭和請求正文历谍。
    數(shù)據(jù)經(jīng)過應用層、傳輸層辣垒、網(wǎng)絡層望侈、數(shù)據(jù)鏈路層、物理層逐層封裝勋桶,傳輸?shù)较乱粋€目的地脱衙。其中每一層的作用如下:
    (5)應用層:為應用進程提供服務,加應用層首部封裝為協(xié)議數(shù)據(jù)單元例驹。
    (4)傳輸層:實現(xiàn)端到端通信捐韩,加TCP首部封裝為數(shù)據(jù)包,TCP控制了數(shù)據(jù)包的發(fā)送序列的產(chǎn)生鹃锈,不斷的調整發(fā)送序列荤胁,實現(xiàn)流控和數(shù)據(jù)完整。
    (3)網(wǎng)絡層:轉發(fā)分組并選擇路由屎债;加IP首部封裝為IP分組仅政。
    (2)數(shù)據(jù)鏈路層:相鄰的節(jié)點間的數(shù)據(jù)傳輸;加首部[mac地址]和尾部封裝為幀盆驹。
    (1)物理層:具體物理媒介中的數(shù)據(jù)傳送圆丹,數(shù)據(jù)轉換為比特流。
    下一個目的地接受到數(shù)據(jù)后躯喇,從物理層得到數(shù)據(jù)然后經(jīng)過逐層的解包 到 鏈路層 到 網(wǎng)絡層运褪,然后開始上述的處理,在經(jīng)網(wǎng)絡層 鏈路層 物理層將數(shù)據(jù)封裝好繼續(xù)傳往下一個地址。
    到達最終目的地秸讹,再經(jīng)過5層結構檀咙,逐層剝離,最終將數(shù)據(jù)送到目的主機的目的端口璃诀。
  4. 服務器處理請求并返回HTTP報文:
    后端從在固定的端口接收到TCP報文開始弧可,這一部分對應于編程語言中的socket。它會對TCP連接進行處理劣欢,對HTTP協(xié)議進行解析棕诵,并按照報文格式進一步封裝成HTTP Request對象,供上層使用凿将。這一部分工作一般是由Web服務器去進行校套。
    HTTP響應報文也是由三部分組成: 狀態(tài)碼, 響應報頭和響應報文。
  5. 瀏覽器解析渲染頁面:
    瀏覽器是一個邊解析邊渲染的過程牧抵。首先瀏覽器解析HTML文件構建DOM樹笛匙,然后解析CSS文件構建渲染樹,等到渲染樹構建完成后犀变,瀏覽器開始布局渲染樹并將其繪制到屏幕上妹孙。這個過程比較復雜,涉及到兩個概念: reflow(回流)和repain(重繪)获枝。DOM節(jié)點中的各個元素都是以盒模型的形式存在蠢正,這些都需要瀏覽器去計算其位置和大小等,這個過程稱為relow;當盒模型的位置,大小以及其他屬性省店,如顏色,字體,等確定下來之后嚣崭,瀏覽器便開始繪制內容,這個過程稱為repain懦傍。頁面在首次加載時必然會經(jīng)歷reflow和repain有鹿。reflow和repain過程是非常消耗性能的,尤其是在移動設備上谎脯,它會破壞用戶體驗,有時會造成頁面卡頓持寄。所以我們應該盡可能少的減少reflow和repain源梭。
  6. 連接結束:
    (1)主機向服務器發(fā)送一個斷開連接的請求(不早了,我該走了)稍味;
    (2)服務器接到請求后發(fā)送確認收到請求的信號(知道了)废麻;
    (3)服務器向主機發(fā)送斷開通知(我也該走了);
    (4)主機接到斷開通知后斷開連接并反饋一個確認信號(嗯模庐,好的)烛愧,服務器收到確認信號后斷開連接;

No.10 數(shù)組去重

ES5寫法1:

function unique(array){
  let tempArray = []
  let hash = {}
  for(let i = 0;i<array.length;i++){
     if(hash[array[i]] === undefined){
       tempArray.push(array[i])
       hash[array[i]] = true
     }
  }
  return tempArray
}

ES5寫法2:當數(shù)組中出現(xiàn)數(shù)字3 和字符串 '3'時,第一種寫法會將其當成同一個值返回怜姿,而第二種寫法可以判斷數(shù)字3 和字符串 '3'的不同慎冤。

function uniqueCom(array) {
  let hash = {}
  let tempArray = []
  array.forEach(function(value) {
    let key = (typeof value) + value;
    if (!hash[key]) {
      hash[key] = true
      tempArray.push(value)
    }
  })
  return tempArray
}

ES6寫法:使用Set對象,MDN文檔
注:用...(展開操作符)操作符將Set轉換為Array

function unique6(array){
  return [...new Set(array)]
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末沧卢,一起剝皮案震驚了整個濱河市蚁堤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌但狭,老刑警劉巖披诗,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異立磁,居然都是意外死亡呈队,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門唱歧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪摧,“玉大人,你說我怎么就攤上這事迈喉∩芄危” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵挨摸,是天一觀的道長孩革。 經(jīng)常有香客問我,道長得运,這世上最難降的妖魔是什么膝蜈? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮熔掺,結果婚禮上饱搏,老公的妹妹穿的比我還像新娘。我一直安慰自己置逻,他們只是感情好推沸,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著券坞,像睡著了一般鬓催。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恨锚,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天宇驾,我揣著相機與錄音,去河邊找鬼猴伶。 笑死课舍,一個胖子當著我的面吹牛塌西,可吹牛的內容都是我干的。 我是一名探鬼主播筝尾,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捡需,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忿等?” 一聲冷哼從身側響起栖忠,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贸街,沒想到半個月后庵寞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡薛匪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年捐川,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逸尖。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡古沥,死狀恐怖,靈堂內的尸體忽然破棺而出娇跟,到底是詐尸還是另有隱情岩齿,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布苞俘,位于F島的核電站盹沈,受9級特大地震影響,放射性物質發(fā)生泄漏吃谣。R本人自食惡果不足惜乞封,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岗憋。 院中可真熱鬧肃晚,春花似錦、人聲如沸仔戈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽监徘。三九已至晋修,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耐量,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工滤港, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廊蜒,地道東北人趴拧。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像山叮,于是被迫代替她去往敵國和親著榴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容