面了挺多公司,可是沒幾個大廠,不敢投,下面按照本身的經歷分爲國企和非國企和共性問題的面經javascript
譬如招銀網絡、順豐科技、4399等中小廠css
具體答案自行查找,我感受每次回答都答不到面試官想要我答的點html
迴流: 當渲染的一部分元素更改本身的寬高等,致使從新構建佈局,就產生了迴流。
重繪: 當一個元素自身的高度沒改變,只改變了背景顏色的,發生重繪。
迴流一定重繪,當重繪不必定迴流。前端
概念:vue
紅寶書:有權訪問另外一個函數做用域中的變量的函數html5
優勢:java
缺點:因爲它是駐留在內存中,會增大內存使用量,使用不當很容易形成內存泄露。node
其實你能夠從用戶輸入url經歷的過程進行分析。mysql
瀏覽器緩存:
首先會檢查瀏覽器緩存,那就可使用它。添加http緩存頭Expires,使組件被緩存,下次訪問的時候,就能夠減小沒必要要的HTPP請求,從而提升加載速度。es6
DNS解析:
DNS解析,能夠設置meta標籤的http-equiv要求DNS預解析,好比遇到超連接就提早解析。
HTTP鏈接上:
常見的減小http請求如靜態資源合併,js和css合併,雪碧圖就不講了。
服務器在完成 HTTP 請求以後不斷開 TCP 鏈接而是掛起,後續有 HTTP 請求能夠直接在這個 TCP 鏈接上發送;缺點是保持長鏈接會消耗服務端的資源。
HTTP/2 多路複用的特性容許多個 HTTP 請求在同一個 TCP 鏈接上發送,能夠節省屢次創建 TCP 鏈接的時間。
可能會給中間人攻擊,解決方法能夠用第三方安全證書來認證。
hasOwnProperty()函數用於指示一個對象自身(不包括原型鏈)是否具備指定名稱的屬性。若是有,返回true,不然返回false。
(屬性名稱 in 對象) 無論屬性是原型的仍是實例的,只要存在就返回ture不然返回false
那麼咱們能夠利用這兩個方法作一個對比,若是實例中沒有且存在了這個屬性,那麼就是原型的
詳細能夠看https://juejin.im/post/58f94c9bb123db411953691b
下面簡略說明:
當訪問一個對象的某個屬性時,會先在這個對象自己屬性上查找,若是沒有找到,則會去它的__proto__隱式原型上查找,若是尚未找到就會再的__proto__中查找,這樣一層一層向上查找最後到object就會造成一個鏈式結構,咱們稱爲原型鏈。
這樣鏈式的鏈接集合就構成了原型鏈。
在object()函數內部, 先建立一個臨時性的構造函數, 而後將傳入的對象做爲這個構造函數的原型,最後返回了這個臨時類型的一個新實例.
function object(o){
function F(){}
F.prototype = o;
return new F();
}
複製代碼
缺點:不是類式繼承,而是原型式基礎,缺乏了類的概念
將父類實例做爲子類的原型對象
function Parent () {
this.names = ['kevin', 'daisy'];
}
function Child () {
}
Child.prototype = new Parent();
var child1 = new Child();
child1.names.push('yayu');
console.log(child1.names); // ["kevin", "daisy", "yayu"]
var child2 = new Child();
console.log(child2.names); // ["kevin", "daisy", "yayu"]
複製代碼
缺點:全部子類的實例的原型都共享同一個父類實例的屬性和方法。
在函數中運行父級構造函數
// 子類
function Sub(){
Super.call(this)
this.property = 'Sub Property'
}
複製代碼
缺點:
父類函數沒有共享,浪費內存。
沒法繼承原型鏈上的屬性和方法。
原型繼承和構造函數繼承的組合
// 子類
function Sub(){
Super.call(this)
this.property = 'Sub Property'
}
Sub.prototype = new Super()
// 注意這裏new Super()生成的超類對象並無constructor屬性,故需添加上
Sub.prototype.constructor = Sub
複製代碼
缺點:父級構造函數被調用兩次,子類實例也有兩份,浪費內存。
實際上子類上會擁有超類的兩份屬性,只是子類的屬性覆蓋了原型對象上的屬性。
原型式繼承套個殼子,增長你要傳入的參數。
function objectCreate(obj){
function F(){}
F.prototype = obj
return new F()
}
function createSubObj(superInstance){
var clone = objectCreate(superInstance)
clone.property = 'Sub Property'
return clone
}
複製代碼
缺點:依舊沒有類的概念
在子構造函數中執行父級函數,並建立Object.create(父級的原型對象)復值給obj,再修改obj的constructor的指針指向子構造函數,最後obj做爲子構造函數的原型對象。
function Sub(){
Super.call(this);
}
var proto = Object.create(Super.prototype);
proto.constructor = Sub;
Sub.prototype = proto ;
複製代碼
同源策略指的是:協議,域名,端口相同,同源策略是一種安全協議。
1xx:指示信息–表示請求已接收.
2xx:成功-請求已接受並返回響應頭
200:請求已成功,返回響應頭。
3xx:重定向–要完成請求必須進行更進一步的操做。
301:請求的資源已被永久移到新位置。
302:臨時重定向
304:緩存的內容並未改變。
4xx:客戶端錯誤–請求有語法錯誤或請求沒法實現。
400:請求無效,前端提交數據的字段名稱或者是字段類型和後臺的實體類不一致。
401:請求要身份驗證。
403:資源不可用。
404:找不到頁面。
5xx:服務器端錯誤–服務器未能實現合法的請求。
500:服務器遇到未知情況,沒法處理。
503:服務器過載或維護。
元素的內容(content),元素的內邊距(padding),元素的邊框(border),元素的外邊距(margin)四個部分
塊格式化上下文(block formatting context) 是Web頁面的可視化CSS渲染出的一部分。
BFC是頁面CSS 視覺渲染的一部分,用於決定塊盒子的佈局及浮動相互影響範圍的一個區域。
BFC的一個最重要的效果是,讓處於BFC內部的元素與外部的元素相互隔離,使內外元素的定位不會相互影響。
利用BFC能夠閉合浮動,防止與浮動元素重疊。
若是子div中有margin-top會外層div塌陷。 解決設置:父設置,overflow:hidden便可。
1:
var copy = JSON.parse(JSON.stringify(person))
複製代碼
缺點:1.沒法拷貝對象中的function、undefined、null、RegExp屬性
2:
function deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key]!==null) {
result[key] = deepCopy(obj[key]); //遞歸複製
} else {
result[key] = obj[key];
}
}
}
return result;
}
複製代碼
缺點就是複雜點
柯里化是把一個多參數函數轉換爲一個嵌套的一元函數的過程
const addCurried = function(x){
return function(y){
return x + y;
}
}
// 使用方法
addCurried(4)(4)
// 8
複製代碼
可以進行延遲計算,就像add(1)(2)同樣,1比2先傳入,2就會被延遲計算,在特定的場景裏,有必定的應用意義。
用在連續點擊div時,
是爲了限制函數一段時間內只能執行一次,在延時的時間內,方法若被觸發,則直接退出方法。
let throttle = (func, wait) => {
let timer;
return function() {
if(timer) {
return ;
}
var self = this;
var args = arguments;
timer = setTimeout(function() {
func.apply(self, args);
timer = null;
}, wait)
}
}
複製代碼
用在搜索輸入時,
函數防抖在執行目標方法時,會等待一段時間。當又執行相同方法時,若前一個定時任務未執行完,則 clear 掉定時任務,從新定時。
let debounce = function(func,wait) {
let timer;
return function(){
let args = arguments;
var self = this;
clearTimeout(timer);
timer = setTimeout(function(){
func.apply(self,args);
}, wait);
}
}
複製代碼
考察控制字段,這個不熟,每次答感受都答不到面試官的點上,自行查找合適的解釋。
做用域鏈就是一個有序的棧,保證對執行環境有權訪問的全部變量和函數的有序訪問。
其餘具體自行查找,我也不能說具體。
不一樣於做用域鏈。
其餘具體自行查找,我也不能說具體。
DOM2事件模型
dom.addEventListener(‘click’,function(){},true) 第一個參數偵聽的事件,第二個參數爲觸發事件執行的方法,第三個true捕獲階段執行,false冒泡階段執行
IE事件流:叫作事件冒泡。從點擊的元素向上傳播。用ele.attachEvent(‘onclick’, function(){ }); 只支持冒泡階段
var obj = new Base();
// 等價於
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
//隨後經過Base.prototype.xxx = () => {}爲Base添加方法時,obj也同時擁有此方法
複製代碼
let:
const:
不寫了,太多
.triangle_border_up{
width:0;
height:0;
border-width: 30px; /*上右下左 上爲0爲上三角形*/
border-style:solid;
border-color:transparent transparent transparent #333;/*透明 透明 透明 灰*/
}
複製代碼
實現三欄水平佈局,其中left、right分別位於左右兩側,left寬度爲200px,right寬度爲300px,main處在中間,寬度自適應。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>實現三欄水平佈局之聖盃佈局</title>
<style type="text/css"> .container { padding: 0 300px 0 200px; } .left, .main, .right { position: relative; min-height: 130px; float: left; } .left { left: -200px; margin-left: -100%; background: green; width: 200px; } .right { right: -300px; margin-left: -300px; background-color: red; width: 300px; } .main { background-color: blue; width: 100%; } </style>
</head>
<body>
<div class="container">
  <div class="main">main</div>
  <div class="left">left</div>
  <div class="right">right</div>
</div>
</body>
</html>
複製代碼
聖盃佈局和雙飛翼佈局解決問題的方案在前一半是相同的,也就是三欄所有float浮動,但左右兩欄加上負margin讓其跟中間欄div並排,以造成三欄佈局。
雙飛翼佈局比聖盃佈局多使用了1個div,少用大體4個css屬性(聖盃佈局container的 padding-left和padding-right這2個屬性,加上左右兩個div用相對佈局position: relative及對應的right和left共4個屬性,;而雙飛翼佈局子div裏用margin-left和margin-right共2個屬性,比聖盃佈局思路更直接和簡潔一點。簡單提及來就是:雙飛翼佈局比聖盃佈局多建立了一個div,但不用相對佈局了。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>實現三欄水平佈局之雙飛翼佈局</title>
<style type="text/css"> .left, .main, .right { float: left; min-height: 130px; text-align: center; } .left { margin-left: -100%; background: green; width: 200px; } .right { margin-left: -300px; background-color: red; width: 300px; } .main { background-color: blue; width: 100%; } .content{ margin: 0 300px 0 200px; } </style>
</head>
<body>
<div class="container">
  <div class="main">
  <div class="content">main</div>
</div>
  <div class="left">left</div>
  <div class="right">right</div>
</div>
</body>
</html>
複製代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>實現三欄水平佈局之Flex佈局</title>
<style type="text/css"> .container{ display: flex; min-height: 130px; } .main{ flex-grow: 1; background-color: blue; } .left{ order: -1; flex-basis: 200px; background-color: green; } .right{ flex-basis: 300px; background-color: red; } </style>
</head>
<body>
<div class="container">
  <div class="main">main</div>
  <div class="left">left</div>
  <div class="right">right</div>
</div>
</body>
</html>
複製代碼
絕對定位使元素的位置與文檔流無關,所以不佔據空間。這一點與相對定位不一樣,相對定位實際上被看做普通流定位模型的一部分,由於元素的位置相對於它在普通流中的位置。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>實現三欄水平佈局之絕對定位佈局</title>
<style type="text/css"> .container{ position: relative; } .main,.right,.left{ top: 0; height: 130px; } .main{ margin: 0 300px 0 200px; background-color: blue; } .right{ position: absolute; width: 300px; right: 0; background-color: red; } .left{ position: absolute; width: 200px; background-color: green; left: 0; } </style>
</head>
<body>
<div class="container">
  <div class="main">main</div>
  <div class="left">left</div>
  <div class="right">right</div>
</div>
</body>
</html>
複製代碼
水平居中:
text-align: center;
複製代碼
margin: 0 auto;
複製代碼
垂直居中:
line-height: height; //height父級高度
複製代碼
position: absolute;
top: 50%;
transform: translate(0, -50%);
複製代碼
display: flex;
flex-direction: column;
justify-content: center;
複製代碼
方法不少:絕對定位、margin: auto、彈性佈局、相對定位、table佈局。
具體自行查找
雪碧圖又叫精靈圖原理就是將一些小圖標合併到一張圖上,用css的背景定位來設置要顯示的部分。
建議先閱讀網上的源碼解析
先轉化成AST樹,再獲得的render函數返回VNode(Vue的虛擬DOM節點)
採用數據劫持結合發佈者-訂閱者模式的方式,經過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變更時發佈消息給訂閱者,觸發相應的監聽回調。
vue實現數據雙向綁定主要步驟:
*更加詳細請看源碼和解析
Vue的路由實現:hash模式 和 history模式
*詳細自行查找
改變狀態的方式,同步邏輯封裝在mutation中,異步邏輯封裝在action中。 詳細自行查找
注意:命名時若是是indexPage,使用的時候用index-page
看源碼解析
一、第一步:解析模板成render函數
template 二、第二步:響應式開始監聽
object.defineProperty
data屬性代理到vm上
三、第三步:首次渲染,顯示頁面,且綁定依賴
(1)爲什麼要監聽get,直接監聽set不行嗎?
①data中有不少屬性,有些被用到,有些可能不被用到(data中沒有人訪問,就不會用get,如沒有{{aaa}}指的就是aaa沒有被訪問)
②被用到的會走到get,不被用到的不會走到get
③未走到get中的屬性,set的時候也無需關心
④避免沒必要要的重複渲染
四、第四步:data屬性變化,觸發rerender defineProperty, get, set
(1)修改屬性,被響應式的set監聽到
(2)set中執行updateComponent
(3)updateComponent從新執行vm._render()
(4)生成的vnode和prevVnode,經過Patch進行對比
渲染到html
通常問項目還有計算機基礎 具體看共性問題
排序、樹、圖……
mysql、mongodb、存儲過程……
……
這些建議查找網上面經,會比個人要詳細不少,要是打算進國企,則必定要有好聊的實習和項目,還有必定的基礎,基本上剩下的就看學歷了。
先寫到這,有緣往後再補充。