前言:本文會羅列出十道比較基礎的題目访递,我個人作為剛入門的初級前端晦嵌,寫這篇文章正好可以總結匯總一下近期的知識,看到這篇文章的朋友也可以看看這十道題你是否都能正確的、完整的答出來惭载。我個人會總結出答案放于文后旱函,歡迎討論。
題目詳情:
1描滔、請寫出一個符合 W3C 規(guī)范的 HTML 文件棒妨,要求如下:
- 頁面標題為「我的頁面」
- 頁面中引入了一個外部 CSS 文件,文件路徑為 /style.css
- 頁面中引入了另一個外部 CSS 文件含长,路徑為 /print.css券腔,該文件僅在打印時生效
- 頁面中引入了另一個外部 CSS 文件,路徑為 /mobile.css茎芋,該文件僅在設備寬度小于 500 像素時生效
- 頁面中引入了一個外部 JS 文件颅眶,路徑為 /main.js
- 頁面中引入了一個外部 JS 文件,路徑為 /gbk.js田弥,文件編碼為 GBK
- 頁面中有一個 SVG 標簽涛酗,SVG 里面有一個直徑為 100 像素的圓圈,顏色隨意
- 注意題目中的路徑
2偷厦、 移動端是怎么做適配的商叹?
注:回答要點:
- meta viewport
- 媒體查詢
- 動態(tài) rem 方案
3、用過CSS3嗎? 實現(xiàn)圓角矩形和陰影怎么做?
4只泼、什么是閉包剖笙,閉包的用途是什么?
5请唱、函數(shù)中call
弥咪、apply
、bind
的用法分別是什么十绑?
6聚至、請說出至少 8 個 HTTP 狀態(tài)碼,并描述各狀態(tài)碼的意義本橙。
7扳躬、請寫出一個 HTTP post 請求的內容,包括四部分甚亭。
其中
第四部分的內容是 username=ff&password=123
第二部分必須含有 Content-Type
字段
請求的路徑為 /path
8贷币、請說出至少三種排序的思路,這三種排序的時間復雜度分別為
- O(n*n)
- O(n log2 n)
- 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]
也就是把重復的值都去掉,只保留不重復的值嘲叔。
要求:
- 不要做多重循環(huán),只能遍歷一次
- 請給出兩種方案抽活,一種能在 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
這個變量余黎。這就是閉包的意義所在。
總結:閉包的用處:
- 可以間接調用函數(shù)內部的局部變量灸蟆。
- 可以讓這些變量的值始終保持在內存中驯耻。
- 可以暫存數(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
县恕、call
、bind
三者都可以利用后續(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-Length
、Content-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)腾么、內存等,我本人目前知識有限杈湾,無法介紹的那么詳細解虱,有興趣的可以點擊上面的鏈接查看。
總體來說分為以下幾個過程:
- 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地址的轉換术陶。 - TCP連接:
知道了服務器的 IP 地址凑懂,下面便開始與服務器建立連接了。
通俗地講梧宫,通信連接的建立需要經(jīng)歷以下三個過程:
(1)主機向服務器發(fā)送一個建立連接的請求(您好接谨,我想認識您);
(2)服務器接到請求后發(fā)送同意連接的信號(好的祟敛,很高興認識您)疤坝;
(3)主機接到同意連接的信號后,再次向服務器發(fā)送了確認信號(我也很高興認識您)馆铁,自此跑揉,主機與服務器兩者建立了連接。 - 發(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ù)送到目的主機的目的端口璃诀。 - 服務器處理請求并返回HTTP報文:
后端從在固定的端口接收到TCP報文開始弧可,這一部分對應于編程語言中的socket。它會對TCP連接進行處理劣欢,對HTTP協(xié)議進行解析棕诵,并按照報文格式進一步封裝成HTTP Request對象,供上層使用凿将。這一部分工作一般是由Web服務器去進行校套。
HTTP響應報文也是由三部分組成: 狀態(tài)碼, 響應報頭和響應報文。 - 瀏覽器解析渲染頁面:
瀏覽器是一個邊解析邊渲染的過程牧抵。首先瀏覽器解析HTML文件構建DOM樹笛匙,然后解析CSS文件構建渲染樹,等到渲染樹構建完成后犀变,瀏覽器開始布局渲染樹并將其繪制到屏幕上妹孙。這個過程比較復雜,涉及到兩個概念: reflow(回流)和repain(重繪)获枝。DOM節(jié)點中的各個元素都是以盒模型的形式存在蠢正,這些都需要瀏覽器去計算其位置和大小等,這個過程稱為relow;當盒模型的位置,大小以及其他屬性省店,如顏色,字體,等確定下來之后嚣崭,瀏覽器便開始繪制內容,這個過程稱為repain懦傍。頁面在首次加載時必然會經(jīng)歷reflow和repain有鹿。reflow和repain過程是非常消耗性能的,尤其是在移動設備上谎脯,它會破壞用戶體驗,有時會造成頁面卡頓持寄。所以我們應該盡可能少的減少reflow和repain源梭。 - 連接結束:
(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)]
}