解釋下瀏覽器是如何判斷元素是否匹配某個 CSS 選擇器?javascript
僞類的用法:html
css動畫和js動畫的優缺點html5
一些編程題
js算法題
答:
ie6,7不支持display:inline-block
參考自: 常見瀏覽器兼容性問題與解決方案
答:
在服務器配置Entity-Tag if-none-match
(1) 可搜索型
(2) 開放性
(3) 費用
(4) 易用性
(5) 易於開發
(1) 多媒體處理
(2) 兼容性
(3) 矢量圖形 比SVG,Canvas優點大不少
(4) 客戶端資源調度,好比麥克風,攝像頭
參考:前端開發的優化問題
CSS3新特性:
參考:CSS3中的一些屬性
答:
答:
參考自: 經驗分享:CSS浮動(float,clear)通俗講解
答:
1
2
|
.clearfloat:after{display:block;clear:both;content:
""
;visibility:hidden;height:0}
.clearfloat{zoom:1}
|
zoom:1的做用: 觸發IE下的hasLayout。zoom是IE瀏覽器專有屬性,能夠設置或檢索對象的縮放比例。
當設置了zoom的值以後,所設置的元素就會擴大或縮小,高度寬度就會從新計算了,這裏一旦改變zoom值時其實也會發生從新渲染,運用這個原理,也就解決了ie下子元素浮動時候父元素不隨着自動擴大的問題。
答: CSS Sprites其實就是把網頁中一些背景圖片整合到一張圖片文件中,再利用CSS的「background-image」,「background- repeat」,「background-position」的組合進行背景定位,background-position能夠用數字能精確的定位出背景圖片的位置。
答:
1) <h1><img src="image.gif" alt="Image Replacement"></h1>
2) 移開文字:
1
2
3
4
|
<
h1
><
span
>Image Replacement</
span
></
h1
>
h1{ background:url(hello_world.gif) no-repeat; width: 150px; height: 35px; }
span { display: none; }
|
注意問題:①結構性須要增長一個標籤包裹文本 ②須要把背景圖設置在外標籤上,並把文本外標籤隱藏.
缺點: 不利於閱覽器瀏覽網頁
3) text-indent屬性,而且給其設置一個較大的負值,x達到隱藏文本的效果
1
2
3
4
5
6
7
8
|
<
h1
class="technique-three">w3cplus</
h1
>
.technique-three {
width: 329px;
height: 79px;
background: url(images/w3cplus-logo.png);
text-indent: -9999px;
}
|
4) 咱們此處使用一個透明的gif圖片,經過在img標籤中的「alt」屬性來彌補display:none。這樣閱讀器之類的就能閱讀到所替換的文本是什麼
<h1 class="technique-five"> <img src="images/blank.gif" alt="w3cplus" /< <span>w3cplus</span> </h1> .technique-five { width: 329px; height: 79px; background: url(images/w3cplus-logo.png); } .technique-five span { display: none; }
5) 使用零高度來隱藏文本,但爲了顯示背景圖片,須要設置一個與替換圖片同樣的大小的padding值
1
2
3
4
5
6
7
8
9
10
|
<
h1
class="technique-six">w3cplus</
h1
>
.technique-six {
width: 329px;
padding: 79px 0 0 0;
height: 0px;
font-size: 0;
background: url(images/w3cplus-logo.png);
overflow: hidden;
}
|
6) 經過把span的大小都設置爲「0」,來達到隱藏文本效果,這樣閱讀器就能徹底閱讀到,並且又達到了圖片替換文本的效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
h1
class="technique-seven">
<
span
>w3cplus</
span
>
</
h1
>
.technique-seven {
width: 329px;
height: 79px;
background: url(images/w3cplus-logo.png);
}
.technique-seven span {
display: block;
width: 0;
height: 0;
font-size: 0;
overflow: hidden;
}
|
7) 利用一個空白的span標籤來放置背景圖片,並對其進行絕對定位,使用覆蓋文本,達到隱藏替換文本的效果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<
h1
class="technique-eight">
<
span
></
span
>w3cplus
</
h1
>
.technique-eight {
width: 329px;
height: 79px;
position: relative;
}
.technique-eight span {
background: url(images/w3cplus-logo.png);
position: absolute;
width: 100%;
height: 100%;
}
|
8) 設置字體爲微小值,但這裏須要注意一點不能忘了設置字體色和替換圖片色同樣,否則會有一個小點顯示出來
1
2
3
4
5
6
7
8
9
|
<
h1
class="technique-nine">w3cplus</
h1
>
.technique-nine {
width: 329px;
height: 79px;
background: url(images/w3cplus-logo.png);
font-size: 1px;
color: white;
}
|
9) 使用css的clip屬性來實現圖片替換文本的效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<
h1
class="technique-ten"><
span
>w3cplus</
span
></
h1
>
.technique-ten {
width: 329px;
height: 79px;
background: url(images/w3cplus-logo.png);
}
.technique-ten span {
border: 0 !important;
clip: rect(1px 1px 1px 1px);
clip: rect(1px,1px,1px,1px);
height: 1px !important;
margin: -1px;
overflow: hidden;
padding: 0 !important;
position: absolute !important;
width: 1px;
}
|
參考自: 十種圖片替換文本CSS方法
1
2
3
4
5
6
7
8
9
10
|
<!--[if !IE]><!-->
除IE外均可識別
<!--<![endif]-->
<!--[if IE]> 全部的IE可識別 <![endif]-->
<!--[if IE 6]> 僅IE6可識別 <![endif]-->
<!--[if lt IE 6]> IE6以及IE6如下版本可識別 <![endif]-->
<!--[if gte IE 6]> IE6以及IE6以上版本可識別 <![endif]-->
<!--[if IE 7]> 僅IE7可識別 <![endif]-->
<!--[if lt IE 7]> IE7以及IE7如下版本可識別 <![endif]-->
<!--[if gte IE 7]> IE7以及IE7以上版本可識別 <![endif]-->
<!--[if IE 8]> 僅IE8可識別 <![endif]-->
<!--[if IE 9]> 僅IE9可識別 <![endif]-->
|
答: 功能限制的瀏覽器, 好比低版本IE, 手機瀏覽器, 等會在不少功能上不符合Web標準, 而應對方式主要有:
參考自: 如何爲有功能限制的瀏覽器提供網頁
答:
1)reset。參照下題「描述下 「reset」 CSS 文件的做用和使用它的好處」的答案。
2)規範命名。尤爲對於沒有語義化的html標籤,例如div,所賦予的class值要特別注意。
2)抽取可重用的部件,注意層疊樣式表的「優先級」。
針對打印機的樣式: @media print{...}
參考:如何優化網頁的打印樣式? 移動端H5知識普及 - CSS3媒體查詢
答: 優勢:
參考: 再談 CSS 預處理器
做者:張靖超連接:https://www.zhihu.com/question/24959507/answer/29672263來源:知乎著做權歸做者全部,轉載請聯繫做者得到受權。
body.ready #wrapper > .lol233
答:
盒模型:文檔中的每一個元素被描繪爲矩形盒子,渲染引擎的目的就是斷定大小,屬性——好比它的顏色、背景、邊框方面——及這些盒子的位置。
在CSS中,這些矩形盒子用標準盒模型來描述。這個模型描述了一個元素所佔用的空間。每個盒子有四條邊界:外邊距邊界margin edge,邊框邊界border edge,內邊距邊界padding edge和內容邊界content edge。
內容區域是真正包含元素內容的區域,位於內容邊界的內部,它的大小爲內容寬度或content-box寬及內容高度或content-box高。若是box-sizing爲默認值,width、min-width、max-width、height、min-height和max-height控制內容大小。
內邊距區域padding area用內容可能的邊框之間的空白區域擴展內容區域。一般有背景——顏色或圖片(不透明圖片蓋住背景顏色)。
邊框區域擴展了內邊距區域。它位於邊框邊界內部,大小爲border-box寬和border-box高。
外邊距區域margin area用空白區域擴展邊框區域,以分開相鄰的元素。它的大小爲margin-box的高寬。
在外邊距合併的狀況下,因爲盒之間共享外邊距,外邊距不容易弄清楚。
對於非替換的行內元素來講,儘管內容周圍存在內邊距與邊框,但其佔用空間(行高)由line-height屬性決定。
盒子模型分爲兩類:W3C標準盒子模型和IE盒子模型 (微軟確實不喜歡服從他家的標準)
這二者的關鍵差異就在於:
咱們在編寫頁面代碼的時候應該儘可能使用標準的W3C盒子模型(須要在頁面中聲明DOCTYPE類型)。
各瀏覽器盒模型的組成結構是一致的,區別只是在"怪異模式"下寬度和高度的計算方式,而「標準模式」下則沒有區別。組成結構以寬度爲例:總寬度=marginLeft+borderLeft+paddingLeft+contentWidth+paddingRight+borderRight+marginRight(W3C標準盒子模型)。頁面在「怪異模式」下,css中爲元素的width和height設置的值在標準瀏覽器和ie系列(ie9除外)裏的表明的含義是不一樣的(IE盒子模型)。
於是解決兼容型爲題最簡潔和值得推薦的方式是:下述的第一條。
參考: 解釋一下你對盒模型的理解,以及如何在 CSS 中告訴瀏覽器使用不一樣的盒模型來渲染你的佈局。
reset.css可以重置瀏覽器的默認屬性。不一樣的瀏覽器具備不一樣的樣式,重置可以使其統一。好比說ie瀏覽器和FF瀏覽器下button顯示不一樣,經過reset可以統同樣式,顯示相同的效果。可是不少reset是不必的,多寫了會增長瀏覽器在渲染頁面的負擔。
好比說,
1)咱們不該該對行內元素設置無效的屬性,對span設置width和height,margin都不會生效的。
2)對於absolute和fixed定位的固定尺寸(設置了width和height屬性),若是設置了top和left屬性,那麼bottom和right,margin和float就沒有做用。
3)後面設置的屬性將會覆蓋前面重複設置的屬性。
說到 IE 的 bug,在 IE6之前的版本中,IE對盒模型的解析出現一些問題,跟其它瀏覽器不一樣,將 border 與 padding 都包含在 width 以內。而另一些瀏覽器則與它相反,是不包括border和padding的。對於IE瀏覽器,當咱們設置 box-sizing: content-box; 時,瀏覽器對盒模型的解釋聽從咱們以前認識到的 W3C 標準,當它定義width和height時,它的寬度不包括border和padding;對於非IE瀏覽器,當咱們設置box-sizing: border-box; 時,瀏覽器對盒模型的解釋與 IE6以前的版本相同,當它定義width和height時,border和padding則是被包含在寬高以內的。內容的寬和高能夠經過定義的「width」和 「height」減去相應方向的「padding」和「border」的寬度獲得。內容的寬和高必須保證不能爲負,必要時將自動增大該元素border box的尺寸以使其內容的寬或高最小爲0。
使用 * { box-sizing: border-box; }可以統一IE和非IE瀏覽器之間的差別。
答:
CSS3的動畫
JavaScript的動畫
結論
答:
經過媒體查詢能夠爲不一樣大小和尺寸的媒體定義不一樣的css,適合相應的設備顯示;即響應式佈局
參考自: CSS3媒體查詢 使用 CSS 媒體查詢建立響應式網站 《響應式Web設計實踐》學習筆記
答:
display:none或者visibility:hidden,overflow:hidden。
通常來說,越詳細的級別越高。CSS優先級包含四個級別(文內選擇符,ID選擇符,Class選擇符,元素選擇符)以及各級別出現的次數。根據這四個級別出現的次數計算獲得CSS的優先級
參考: CSS樣式選擇器優先級
答:
答: BFC指的是Block Formatting Context, 它提供了一個環境, html元素在這個環境中按照必定規則進行佈局. 一個環境中的元素不會影響到其餘環境中的佈局. 決定了元素如何對其內容進行定位, 以及和其餘元素的關係和相互做用.
其中: FC(Formatting Context): 指的是頁面中的一個渲染區域, 而且擁有一套渲染規則, 它決定了其子元素如何定位, 以及與其餘元素的相互關係和做用.
BFC: 塊級格式化上下文, 指的是一個獨立的塊級渲染區域, 只有block-level box參與, 該區域擁有一套渲染規則來約束塊級盒子的佈局, 且與區域外部無關.
參考: 我對BFC的理解 CSS BFC和IE Haslayout介紹
答:
參考自: 猿教程
答:
參考自: 理解HTML語義化
答:
答:
答:
答: 採用統一編碼utf-8模式
1
2
3
4
5
6
7
8
9
10
11
|
<META HTTP-EQUIV=「Content-Type」 CONTENT=「text/html; CHARSET=字符集">
不寫,根據瀏覽器默認字符集顯示
charset=gb2312 簡體中文
charset=big5 繁體中文
charset=EUC_KR 韓語
charset=Shift_JIS 或 EUC_JP 日語
charset= KOI8-R / Windows-1251 俄語
charset=iso-8859-1 西歐語系(荷蘭語,英語,法語,德語,意大利語,挪威語,葡萄牙語,瑞士語.等十八種語言)
charset=iso-8859-2 中歐語系
charset=iso-8859-5 斯拉夫語系(保加利亞語,Byelorussian語,馬其頓語,俄語,塞爾維亞語,烏克蘭語等)
charset=uft-8 unicode多語言
|
參考自: 多語言的網站怎麼作呀 多語言網站設計須要注意的問題
爲前端開發者提供自定義的屬性,這些屬性集能夠經過對象的dataset屬性獲取,不支持該屬性的瀏覽器能夠經過 getAttribute方法獲取
<div data-author="david" data-time="2011-06-20" data-comment-num="10">...</div>
div.dataset.commentNum; // 可經過js獲取 10
答:
1)Web Storage API
2)基於位置服務LBS
3)無插件播放音頻視頻
4)調用相機和GPU圖像處理單元等硬件設備
5)拖拽和Form API
答:
sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,這兩種方式都容許開發者使用js設置的鍵值對進行操做,在在從新加載不一樣的頁面的時候讀出它們。這一點與cookie相似。能夠方便的在web請求之間保存數據。有了本地數據,就能夠避免數據在瀏覽器和服務器間沒必要要地來回傳遞。
sessionStorage、localStorage、cookie都是在瀏覽器端存儲的數據,
其中sessionStorage的概念很特別,引入了一個「瀏覽器窗口」的概念。 sessionStorage是在同源的同學口(或tab)中,始終存在的數據。也就是說只要這個瀏覽器窗口沒有關閉,即便刷新頁面或進入同源另外一頁面,數據仍然存在。關閉窗口後,sessionStorage即被銷燬。同時「獨立」打開的不一樣窗口,即便是同一頁面,sessionStorage對象也是不一樣的。
Web Storage 數據徹底存儲在客戶端, 不須要經過瀏覽器的請求將數據傳給服務器, 所以比cookies可以存儲更多的數據,大概5M左右
Web Storage帶來的好處:使用 local storage和session storage主要經過在js中操做這兩個對象來實現,分別爲window.localStorage和window.sessionStorage. 這兩個對象均是Storage類的兩個實例,天然也具備Storage類的屬性和方法。
減小網絡流量:一旦數據保存在本地後,就能夠避免再向服務器請求數據,所以減小沒必要要的數據請求,減小數據在瀏覽器和服務器間沒必要要地來回傳遞。
快速顯示數據:性能好,從本地讀數據比經過網絡從服務器得到數據快得多,本地數據能夠即時得到。再加上網頁自己也能夠有緩存,所以整個頁面和數據都在本地的話,能夠當即顯示。
臨時存儲:不少時候數據只須要在用戶瀏覽一組頁面期間使用,關閉窗口後數據就能夠丟棄了,這種狀況使用sessionStorage很是方便。
答:
答:
答:
參考: 《JavaScript》高級程序設計第21章:Ajax和Comet
參考自: 區別和詳解:js中call()和apply()的用法
new
操做符建立對象:這種行爲就像把原函數當成構造器。提供的 this 值被忽略,同時調用時的參數被提供給模擬函數。 答: 事件委託利用了事件冒泡, 只指定一個事件處理程序, 就能夠管理某一類型的全部事件.
例:
html部分: 要點擊li彈出其id
<ul id="list"> <li id="li-1">Li 2</li> <li id="li-2">Li 3</li> <li id="li-3">Li 4</li> <li id="li-4">Li 5</li> <li id="li-5">Li 6</li> <li id="li-6">Li 7</li> </ul>
//js部分
document.getElementById("list").addHandler("click", function(e){ var e = e || window.event; var target = e.target || e.srcElement; if(target.nodeName.toUpperCase == "LI"){ console.log("List item", e,target.id, "was clicked!"); } });
答:
this 在 JavaScript 中主要由如下五種使用場景。
參考:js怎麼實現繼承?
答: AMD是依賴提早加載,CMD是依賴延時加載
答: 哈希表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫作散列函數,存放記錄的數組叫作散列表。
使用哈希查找有兩個步驟:
元素特徵轉變爲數組下標的方法就是散列法。散列法固然不止一種,下面列出三種比較經常使用的:
1,除法散列法
最直觀的一種,上圖使用的就是這種散列法,公式:
index = value % 16
學過彙編的都知道,求模數實際上是經過一個除法運算獲得的,因此叫「除法散列法」。
2,平方散列法
求index是很是頻繁的操做,而乘法的運算要比除法來得省時(對如今的CPU來講,估計咱們感受不出來),因此咱們考慮把除法換成乘法和一個位移操做。公式:
index = (value * value) >> 28 (右移,除以2^28。記法:左移變大,是乘。右移變小,是除。)
若是數值分配比較均勻的話這種方法能獲得不錯的結果,但我上面畫的那個圖的各個元素的值算出來的index都是0——很是失敗。也許你還有個問題,value若是很大,value * value不會溢出嗎?答案是會的,但咱們這個乘法不關心溢出,由於咱們根本不是爲了獲取相乘結果,而是爲了獲取index。
3,斐波那契(Fibonacci)散列法
解決衝突的方法:
1. 拉鍊法
將大小爲M 的數組的每個元素指向一個條鏈表,鏈表中的每個節點都存儲散列值爲該索引的鍵值對,這就是拉鍊法.
對採用拉鍊法的哈希實現的查找分爲兩步,首先是根據散列值找到等一應的鏈表,而後沿着鏈表順序找到相應的鍵。
2. 線性探測法:
使用數組中的空位解決碰撞衝突
參考: 哈希表的工做原理 淺談算法和數據結構: 十一 哈希表
答:
參考自: js閉包的用途
參考: 僞數組
(1) 做爲函數的參數,表示該函數的參數不是對象。
(2) 做爲對象原型鏈的終點。
(1)變量被聲明瞭,但沒有賦值時,就等於undefined。
(2) 調用函數時,應該提供的參數沒有提供,該參數等於undefined。
(3)對象沒有賦值的屬性,該屬性的值爲undefined。
(4)函數沒有返回值時,默認返回undefined。
從目標元素開始,往頂層元素傳播。途中若是有節點綁定了相應的事件處理函數,這些函數都會被一次觸發。若是想阻止事件起泡,能夠使用e.stopPropagation()(Firefox)或者e.cancelBubble=true(IE)來組織事件的冒泡傳播。
答:
而函數定義(語句以function關鍵字開始)是不能被當即執行的,這無疑會致使語法的錯誤(SyntaxError)。當函數定義代碼段包裹在括號內,使解析器能夠將之識別爲函數表達式,而後調用。IIFE: (function foo(){})()
區分 (function(){})(); 和 (function(){}()); 其實二者實現效果同樣。
函數字面量:首先聲明一個函數對象,而後執行它。(function () { alert(1); })();
優先表達式:因爲Javascript執行表達式是從圓括號裏面到外面,因此能夠用圓括號強制執行聲明的函數。(function () { alert(2); }());
答:
DOM元素的attribute和property二者是不一樣的東西。attribute翻譯爲「特性」,property翻譯爲「屬性」。
attribute是一個特性節點,每一個DOM元素都有一個對應的attributes屬性來存放全部的attribute節點,attributes是一個類數組的容器,說得準確點就是NameNodeMap,不繼承於Array.prototype,不能直接調用Array的方法。attributes的每一個數字索引以名值對(name=」value」)的形式存放了一個attribute節點。<div class="box" id="box" gameid="880">hello</div>
property就是一個屬性,若是把DOM元素當作是一個普通的Object對象,那麼property就是一個以名值對(name=」value」)的形式存放在Object中的屬性。要添加和刪除property和普通的對象相似。
不少attribute節點還有一個相對應的property屬性,好比上面的div元素的id和class既是attribute,也有對應的property,無論使用哪一種方法均可以訪問和修改。
總之,attribute節點都是在HTML代碼中可見的,而property只是一個普通的名值對屬性。
答:
在全部的函數 (或者全部最外層函數) 的開始處加入 "use strict"; 指令啓動嚴格模式。
"嚴格模式"有兩種調用方法
1)將"use strict"放在腳本文件的第一行,則整個腳本都將以"嚴格模式"運行。若是這行語句不在第一行,則無效,整個腳本以"正常模式"運行。若是不一樣模式的代碼文件合併成一個文件,這一點須要特別注意。
2)將整個腳本文件放在一個當即執行的匿名函數之中。
好處
- 消除Javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲;
- 消除代碼運行的一些不安全之處,保證代碼運行的安全;
- 提升編譯器效率,增長運行速度;
- 爲將來新版本的Javascript作好鋪墊。
壞處
一樣的代碼,在"嚴格模式"中,可能會有不同的運行結果;一些在"正常模式"下能夠運行的語句,在"嚴格模式"下將不能運行
答: 核心( ECMAScript) , 文檔對象模型(DOM), 瀏覽器對象模型(BOM)
答: DOM是針對HTML和XML文檔的一個API(應用程序編程接口). DOM描繪了一個層次化的節點樹, 容許開發人員添加, 移除和修改頁面的某一部分.
參考: HTML DOM 方法
答: Undefined, Null, Boolean, Number, String
Object是複雜數據類型, 其本質是由一組無序的名值對組成的.
答:
參考: 《JavaScript高級程序設計》
js是一門具備自動垃圾回收機制的編程語言,開發人員沒必要關心內存分配和回收問題
答: try-catch 和with延長做用域. 由於他們都會建立一個新的變量對象.
這兩個語句都會在做用域鏈的前端添加一個變量對象. 對with語句來講, 會將指定的對象添加到做用域鏈中. 對catch語句來講, 會建立一個新的變量對象, 其中包含的是被拋出的錯誤對象的聲明.
function buildUrl(){ var qs = "?debug=true"; //with接收location對象, 所以其變量對象中就包含了location對象的全部屬性和方法, 而這個變量對象被添加到了做用域鏈的前端 with(location){ //這裏的href實際上是location.href. 建立了一個名爲url的變量, 就成了函數執行環境的一部分 var url = href + qs; } return url; }
參考: js try、catch、finally語句還有with語句 JavaScript 開發進階:理解 JavaScript 做用域和做用域鏈
答:
答: 捕獲->處於目標->冒泡,IE應該是隻有冒泡沒有捕獲。
事件代理就是在父元素上綁定事件來處理,經過event對象的target來定位。
答: 用定時器 setTimeout和setInterval
答:
transition-delay
transition-duration
transition-property
transition-timing-function
,對應動畫的4種屬性: 延遲、持續時間、對應css屬性和緩動函數,transform 包含7種屬性:animation-name
animation-duration
animation-timing-function
animation-delay
animation-direction
animation-iteration-count
animation-fill-mode
animation-play-state
,它們能夠定義動畫名稱,持續時間,緩動函數,動畫延遲,動畫方向,重複次數,填充模式。
參考自: 前端動畫效果實現的簡單比較
答: 封裝, 繼承, 多態
答: hasOwnPrototype
答:
1) 箭頭操做符 inputs=>outputs: 操做符左邊是輸入的參數,而右邊則是進行的操做以及返回的值
2) 支持類, 引入了class關鍵字. ES6提供的類實際上就是JS原型模式的包裝
3) 加強的對象字面量.
1. 能夠在對象字面量中定義原型 __proto__: xxx //設置其原型爲xxx,至關於繼承xxx
2. 定義方法能夠不用function關鍵字
3. 直接調用父類方法
4) 字符串模板: ES6中容許使用反引號 ` 來建立字符串,此種方法建立的字符串裏面能夠包含由美圓符號加花括號包裹的變量${vraible}。
5) 自動解析數組或對象中的值。好比若一個函數要返回多個值,常規的作法是返回一個對象,將每一個值作爲這個對象的屬性返回。但在ES6中,利用解構這一特性,能夠直接返回一個數組,而後數組中的值會自動被解析到對應接收該值的變量中。
6) 默認參數值: 如今能夠在定義函數的時候指定參數的默認值了,而不用像之前那樣經過邏輯或操做符來達到目的了。
7) 不定參數是在函數中使用命名參數同時接收不定數量的未命名參數。在之前的JavaScript代碼中咱們能夠經過arguments變量來達到這一目的。不定參數的格式是三個句點後跟表明全部不定參數的變量名。好比下面這個例子中,…x表明了全部傳入add函數的參數。
8) 拓展參數則是另外一種形式的語法糖,它容許傳遞數組或者類數組直接作爲函數的參數而不用經過apply。
9) let和const關鍵字: 能夠把let當作var,只是它定義的變量被限定在了特定範圍內才能使用,而離開這個範圍則無效。const則很直觀,用來定義常量,即沒法被更改值的變量。
10) for of值遍歷 每次循環它提供的不是序號而是值。
11) iterator, generator
12) 模塊
13) Map, Set, WeakMap, WeakSet
14) Proxy能夠監聽對象身上發生了什麼事情,並在這些事情發生後執行一些相應的操做。一會兒讓咱們對一個對象有了很強的追蹤能力,同時在數據綁定方面也頗有用處。
15) Symbols Symbol 經過調用symbol函數產生,它接收一個可選的名字參數,該函數返回的symbol是惟一的。以後就能夠用這個返回值作爲對象的鍵了。Symbol還能夠用來建立私有屬性,外部沒法直接訪問由symbol作爲鍵的屬性值。
16) Math, Number, String, Object的新API
17) Promises是處理異步操做的一種模式
參考: ES6新特性概覽
答: getElementById() getElementsByTagName()
節點遍歷: 先序遍歷DOM樹的5種方法
答: 能夠自定義一個函數
1
2
3
4
5
6
7
8
|
.border-radius(@values) {
-webkit-border-radius: @values;
-moz-border-radius: @values;
border-radius: @values;
}
div {
.border-radius(10px);
}
|
答:
答:
我在回答這個題的時候說是兩個事件, 先執行捕獲的後執行冒泡的. 實際上是不對的.
綁定在目標元素上的事件是按照綁定的順序執行的!!!!
即: 綁定在被點擊元素的事件是按照代碼順序發生,其餘元素經過冒泡或者捕獲「感知」的事件,按照W3C的標準,先發生捕獲事件,後發生冒泡事件。全部事件的順序是:其餘元素捕獲階段事件 -> 本元素代碼順序事件 -> 其餘元素冒泡階段事件 。
參考: JavaScript-父子dom同時綁定兩個點擊事件,一個用捕獲,一個用冒泡時執行順序
答:
塊級做用域引入了兩種新的聲明形式,能夠用它們定義一個只存在於某個語句塊中的變量或常量.這兩種新的聲明關鍵字爲:
let
: 語法上很是相似於var
, 但定義的變量只存在於當前的語句塊中const
: 和let
相似,但聲明的是一個只讀的常量使用let
代替var
能夠更容易的定義一個只在某個語句塊中存在的局部變量,而不用擔憂它和函數體中其餘部分的同名變量有衝突.在let
語句內部用var
聲明的變量和在let
語句外部用var
聲明的變量沒什麼差異,它們都擁有函數做用域,而不是塊級做用域.
答:
1. 直接調用function,每個類的實例都會拷貝這個函數,弊端就是浪費內存(如上)。prototype方式定義的方式,函數不會拷貝到每個實例中,全部的實例共享prototype中的定義,節省了內存。
2. 可是若是prototype的屬性是對象的話,全部實例也會共享一個對象(這裏問的是函數應該不會出現這個狀況),若是其中一個實例改變了對象的值,則全部實例的值都會被改變。同理的話,若是使用prototype調用的函數,一旦改變,全部實例的方法都會改變。——不能夠對實例使用prototype屬性,只能對類和函數用。
答:
由於js中數據類型分爲基本數據類型(number, string, boolean, null, undefined)和引用類型值(對象, 數組, 函數). 這兩類對象在複製克隆的時候是有很大區別的. 原始類型存儲的是對象的實際數據, 而對象類型存儲的是對象的引用地址(對象的實際內容單獨存放, 爲了減小數據開銷一般放在內存中). 此外, 對象的原型也是引用對象, 它把原型的屬性和方法放在內存中, 經過原型鏈的方式來指向這個內存地址.
因而克隆也會分爲兩類:
深度克隆實現:
function clone(obj){ if(typeof(obj)== 'object'){ var result = obj instanceof Array ? [] : {}; for(var i in obj){ var attr = obj[i]; result[i] = arguments.callee(attr); } return result; } else { return obj; } };
參考: JavaScript深克隆 javascript中對象的深度克隆
1. var obj = {a : 1}; (function (obj) { obj = {a : 2}; })(obj); //問obj怎麼變?
答: 外部的obj不變. 由於匿名函數中obj傳入參數等因而建立了一個局部變量obj, 裏面的obj指向了一個新的對象 . 若是改爲(function () { obj = {a : 2}; })(obj); 就會變了
2. var obj = { a:1, func: function() { (function () { a=2; }(); }} ; obj.fun() //a 怎麼變? 匿名函數裏的this 是什麼?
答: obj裏的a不會變. 匿名函數裏的this指向全局對象window. 這等因而給window加了一個名爲a的屬性
要改變obj中a的值 , 應當:
(function() { this.a = 2}).call(this);
或者obj中定義func : func: function() { var self = this; (function(){self.a=2;})();}
3. 要實現函數內每隔5秒調用本身這個函數,100次之後中止,怎麼辦
想到了用閉包, 可是寫錯了...
一開始是這麼寫的
1
2
3
4
5
6
7
|
//注意!!這種寫法是錯誤的!!! for(var i=0; i<oLis.length; i++){
oLis[i].onclick =
function
(){
return
(
function
(j){
alert(j);
})(i);
}
}
|
可是這樣作的話, 點擊全部的li都會彈出最後一個序號. 由於每一個li對應的onclick事件的函數, 返回的那個函數的參數仍是最後的那個i, 並無改變. 應該是這麼寫
方法1 :
1
2
3
4
5
6
7
|
for
(
var
i=0; i<oLis.length; i++){
oLis[i].onclick = (
function
(j){
return
function
(){
alert(j);
}
})(i);
}
|
這樣的話, 給每一個li綁定onclick事件時, 其實綁的是一個當即執行函數, 這個當即執行函數的參數是i, 由於它是當即執行的, 循環時已經把i的值賦給了li的onclick事件, 因此在外部函數裏的i改變後並不會影響i的值.
另外一種實現方法:(當即執行函數)
1
2
3
4
5
6
7
|
for
(
var
i=0; i<oLi.length; i++){
(
function
(j){
oLi[j].onclick =
function
(){
alert(j);
};
})(i);
}
|
或者不用閉包
方法2:
var oLi = document.getElementsByTagName('li'); function func(obj,i){ obj.onclick = function(){ alert (i); } } for(var i = 0; i<oLi.length; i++){ func(oLi[i], i); }
方法3: 設置屬性:
1
2
3
4
|
var
oLi = document.getElementsByTagName(
'li'
);
for
(
var
i=0; i<oLi.length; i++){
oLi[i].setAttribute(
"onclick"
,
"alert("
+i+
");"
);
}
|
方法4: 設置index保存
1
2
3
4
5
6
|
for
(
var
i=0; i<oLi.length; i++){
oLi[i].index = i;
oLi[i].onclick =
function
(){
alert(
this
.index);
}
}
|
或者也能夠用事件代理來作.
方法1. 建立一個新的臨時數組來保存數組中已有的元素
1
2
3
4
5
6
7
8
9
10
11
12
|
var
a =
new
Array(1,2,2,2,2,5,3,2,9,5,6,3);
Array.prototype.unique1 =
function
(){
var
n = [];
//一個新的臨時數組
for
(
var
i=0; i<
this
.length; i++){
//若是把當前數組的第i已經保存進了臨時數組, 那麼跳過
if
(n.indexOf(
this
[i]) == -1){
n.push(
this
[i]);
}
}
return
n;
}
console.log(a.unique1());
|
方法2. 使用哈希表存儲已有的元素
1
2
3
4
5
6
7
8
9
10
11
|
Array.prototype.unique2 =
function
(){
var
hash = {},
n = [];
//hash 做爲哈希表, n爲臨時數組
for
(
var
i=0; i<
this
.length; i++){
if
(!hash[
this
[i]]){
//若是hash表中沒有當前項
hash[
this
[i]] =
true
;
//存入hash表
n.push(
this
[i]);
//當前元素push到臨時數組中
}
}
return
n;
}
|
方法3. 使用indexOf判斷數組元素第一次出現的位置是否爲當前位置
1
2
3
4
5
6
7
8
9
10
11
12
|
Array.prototype.unique3 =
function
(){
var
n = [
this
[0]];
for
(
var
i=1; i<
this
.length; i++)
//從第二項開始遍歷
{
//若是當前數組元素在數組中出現的第一次的位置不是i
//說明是重複元素
if
(
this
.indexOf(
this
[i]) == i){
n.push(
this
[i]);
}
}
return
n;
}
|
方法4. 先排序再去重
1
2
3
4
5
6
7
8
9
10
|
Array.prototype.unique4 =
function
(){
this
.sort(
function
(a, b){
return
a - b;});
var
n = [
this
[0]];
for
(
var
i=1; i<
this
.length; i++){
if
(
this
[i] !=
this
[i-1]){
n.push(
this
[i]);
}
}
return
n;
}
|
第一種方法和第三種方法都使用了indexOf(), 這個函數的執行機制也會遍歷數組
第二種方法使用了一個哈希表, 是最快的.
第三種方法也有一個排序的複雜度的計算.
而後作了個測試, 隨機生成100萬個0-1000的數組結果以下:
第三種方法老是第二種方法的將近兩倍, 而第四種方法與數組的範圍有關,
若是是0-100的數組
而若是是0-10000, 方法四看着就效果還不錯了
而第二種方法永遠是最好的, 可是是以空間換時間
所有代碼以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
var
a = [];
for
(
var
i=0; i<1000000; i++){
a.push(Math.ceil(Math.random()*10000));
}
Array.prototype.unique1 =
function
(){
var
n = [];
//一個新的臨時數組
for
(
var
i=0; i<
this
.length; i++){
//若是把當前數組的第i已經保存進了臨時數組, 那麼跳過
if
(n.indexOf(
this
[i]) == -1){
n.push(
this
[i]);
}
}
return
n;
}
Array.prototype.unique2 =
function
(){
var
hash = {},
n = [];
//hash 做爲哈希表, n爲臨時數組
for
(
var
i=0; i<
this
.length; i++){
if
(!hash[
this
[i]]){
//若是hash表中沒有當前項
hash[
this
[i]] =
true
;
//存入hash表
n.push(
this
[i]);
//當前元素push到臨時數組中
}
}
return
n;
}
Array.prototype.unique3 =
function
(){
var
n = [
this
[0]];
for
(
var
i=1; i<
this
.length; i++)
//從第二項開始遍歷
{
//若是當前數組元素在數組中出現的第一次的位置不是i
//說明是重複元素
if
(
this
.indexOf(
this
[i]) == i){
n.push(
this
[i]);
}
}
return
n;
}
Array.prototype.unique4 =
function
(){
this
.sort(
function
(a, b){
return
a - b;});
var
n = [
this
[0]];
for
(
var
i=1; i<
this
.length; i++){
if
(
this
[i] !=
this
[i-1]){
n.push(
this
[i]);
}
}
return
n;
}
var
begin1 =
new
Date();
a.unique1();
var
end1 =
new
Date();
var
begin2 =
new
Date();
a.unique2();
var
end2 =
new
Date();
var
begin3 =
new
Date();
a.unique3();
var
end3 =
new
Date();
var
begin4 =
new
Date();
a.unique4();
var
end4 =
new
Date();
console.log(
"方法一執行時間:"
+ (end1 - begin1));
console.log(
"方法二執行時間:"
+ (end2 - begin2));
console.log(
"方法三執行時間:"
+ (end3 - begin3));
console.log(
"方法四執行時間:"
+ (end4 - begin4));
|
參考: js數組去重
瞭解先後端分離嗎(當時真不瞭解,但他細心地給我解釋了一下,還建議我去看淘寶ued團隊的文章)
用什麼版本控制工具在用mac嗎用什麼來管理各類依賴數組去重position的幾種值css選擇器優先級僞類的用法閉包閉包的實現舉例浮動清除浮動jsonp是啥gulp怎麼用,用過啥你以爲你還有什麼閃光點我沒有問到的(這個太囧了,我竟然反問了面試官你以爲我剛纔閃不閃?面試官呵呵呵呵)require的讀取順序圖片輪播(雖然不少面試題都有這個,可是我本身真的沒有實現過,說了一個opacity與setTimeout的組合運用,最後沒有實現到面試官要求的效果,可是他說還行)sass的僞類怎麼嵌套jsonp是啥怎麼用jsonp發送jsonp時候的那個消息頭長什麼樣子?(這個我直接跟他說沒看過不知道)一個文本框,須要兩個控件對裏面的值進行控制,一個是+1一個是-1,要求每點擊一次就有個提示框冒出來。並且文本框是可修改的,每次修改也會冒出提示框。(這個我回答的很模糊,我說應該有個監聽的事件的,可是我忘了是啥了,面試官說也行)css定位百度(很驚奇的是面試個人三個面試官都是女生,簡直了)一面css position的幾種值與區別閉包偏向於什麼語言?html、css or javascript開發中偏於jQuery仍是原生js爲何選擇原生js?最近作過的項目那個系統還在用嗎你是怎麼學的?看英文有障礙嗎(臥槽,當時我回答了徹底沒有問題,不知道哪裏來的自信)二面html5的新功能瞭解多少說說離線存儲它們與cookie的區別this的理解怎麼傳入thisapply和call的區別項目您說說你github上面那個打字機的效果是怎麼實現的(這是我fork了一位小夥伴的,但幸虧我也花了一點時間弄懂了他的作法,要否則確定囧死。插播一個很硬的廣告 github.com/sidkwok/typing)前端優化你用過哪些優化(我說了css sprite和減小http請求,順便引出了webpack,但沒想到她也沒有問)gulp你是怎麼用的jsonp是啥怎麼跨域爲何要跨域怎麼學習的position幾種值具體運用是什麼display幾種值兼容性你懂多少(我就說了Ajax的還有盒子模型,但她說還有不少,但以前我說了沒有系統地去學過css,都是不會的時候查文檔的,估計由於這樣因此她也沒有追問下去)說說你瞭解的框架(我說了react和vue)react你以爲怎樣(我說了一些組件化和虛擬dom樹的東西)AngularJS呢(我說沒有學過,但瞭解過一點,我把我瞭解的都說了給她聽)兩個的比較爲何你會以爲AngularJS笨重?(也是本身的見解,mvc框架嘛,一整套什麼都有)jQuery仍是原生js(百度的面試官都問了這個問題,我直接說對於jQuery我並非很熟悉,由於我更喜歡研究原生js。)爲何選擇原生js(我認爲要把原生吃透再去理解其餘類庫的話會更好一點,她說也是)三面(二面問面試官我表現怎樣的時候她說,我能夠跟你講你已通過了,個人助理會跟你通知的。覺得是hr面沒想到仍是技術面)介紹本身說說框架比較一下框架你打算怎麼去學這些框架據說你在瀏覽器兼容性這邊學習的不是很好(不慌,她只是建議我這方面其實也很重要)對本身的規劃喜歡用什麼系統來,咱們聊聊人生daocloud一面html語義化h5新標籤es6promisepromise解決了你什麼問題跨域的方法jsonp怎麼用用過什麼庫gulp的插件用過啥webpack爲何要打包 (我說了http請求那點事)介紹一下react組件化是啥你覺的react的優勢爲何沒有選擇學習AngularJSflex響應式佈局是啥響應式佈局是根據什麼進行響應css中用什麼進行屏幕的斷定css中實現陰影的有什麼二面點擊a標籤發生了啥http2您說說說說各類框架聊聊AngularJS(說了個人理解,但不怎麼了解)那你熟悉哪一個框架(正在玩React,vue也懂一點)你給我說說你那個博客生成器(github.com/sidkwok/tech-dairy)(我知道我知道,不少廣告!)聊聊項目聊聊模塊化吧sass你怎麼用gulp用過啥介紹一下webpack實現sum(2,3);sum(2,3,4);sum(2,3,4,5);(我用了比較原始的方法,if來判斷)那若是sum裏面的參數不肯定呢(提取arguments的長度,用for循環)你知道僞數組嗎?ok, 再來一個數組去重吧(這太經典了吧)
- MVC理解
二面問
項目中你解決過哪些比較困難的問題
參考博文: 前端面試問題 不徹底的搜狐前端面經 2016美團web前端面試經驗 百度,網易,daocloud,領孚科技,前端開發實習生面經 百度內推兩輪技術面試分享
前端工做面試問題(下) 前端工做面試問題(上) [這個姑娘博客裏有超多幹貨~]
2016春網易前端暑期實習生筆試面經(二面已掛) 新鮮出爐的網易前端面經
前端網: 前端開發面試題總結--(四)前端綜合
markyun.github:前端開發面試題