計算機基礎知識:css
1.簡單舉例介紹下列表(list),隊列(queue),集合(set),字典(map),樹(tree),圖(graph)的差異。html
2.內存溢出和內存泄露前端
內存溢出是指已有的數據超過了其得到到的內存所能存儲的範圍,好比用一個字節存放1000這個數字就屬於內存溢出;
es6
內存泄露是指程序因爲錯誤或漏洞形成的內存佔用過多,或佔用內存後沒法釋放(不少狀況是申請了內存,但程序結束後沒有釋放)。redis
3.數據庫中索引,主鍵,惟一索引,聯合索引的區別,對數據庫性能有什麼影響算法
索引是一種特殊文件,它包含對數據表裏全部記錄的引用指針mongodb
普通索引的惟一做用是加快訪問速度數據庫
普通索引,被索引的數據中能夠包含重複的數據,惟一索引就是規定了索引到的值各不相同json
主鍵是一種特殊的惟一索引,一個表中只能容許有一個主鍵,用來惟一標識一條記錄
數組
聯動索引就是索引能夠覆蓋多個數據列
索引加快了查詢的速度,可是減慢了添加刪除更新的速度,由於在執行這些操做以前須要先索引
4.數據庫中內聯接和外聯接區別
內聯接:指鏈接結果僅包含符合鏈接條件的行,參與鏈接的兩個表都應該符合鏈接條件。
外聯接:鏈接結果不只包含符合鏈接條件的行同時也包含自身不符合條件的行。包括左外鏈接,右外鏈接和全外鏈接。
內聯接只能查詢兩個表中關係匹配的記錄;外聯接不只能查詢兩個表中關係匹配的記錄,並且能夠查詢不匹配的記錄。
5.線程和進程,多線程中死鎖怎麼處理
聯繫:
一個線程只屬於一個進程,一個進程能夠擁有多個線程,但至少有一個線程,稱爲主線程
資源統一分配給進程,同一進程中的線程共享該進程的全部資源
線程在執行過程當中,須要協做同步,不一樣進程之間線程須要經過消息通訊來達到同步。
區別:
線程做爲調度和分配的基本單位,進程做爲分配資源的基本單位
併發性:不只進程之間能夠併發執行,同一進程中的不一樣線程之間也能進行併發執行
擁有資源:進程是擁有資源的獨立單位,線程不用有資源,但能夠訪問隸屬於進程的全部資源。
何時用多線程:
耗時或大量佔用處理器阻塞用戶界面操做
各個任務必須等待外部資源時
避免多線程中死鎖:
加鎖順序(線程按照必定的順序加鎖)
加鎖時限(線程嘗試獲取鎖的時候加上必定的時限,超過期限則放棄對該鎖的請求,並釋放本身佔有的鎖)
死鎖檢測
6.緩存的應用場景
緩存,就是數據暫存的地方,能夠理解爲從磁盤裏取出來數據,暫時存放在內存,以待後面處理來讀取。而能存放在緩存的數據,一般是頻繁訪問的,不會常常修改的數據。知道了什麼是緩存,什麼數據能夠放緩存,就能夠尋找合適的緩存(這裏說的緩存,就是對象或者容器了)。
目前,緩存的操做主要是兩種方式,一種是使用程序自帶的map對象(像jdk的hashmap),一種是緩存軟件,第一種不細說,你們能夠看看hashmap的實現和應用,這裏主要說緩存軟件。如今流行的緩存軟件是memcached,redis,mongodb。我的認爲,由於要兼顧DB的某些特性,因此作不到其餘兩個緩存的爲了實現極高的吞吐量而採用的epoll 或 libevent事件驅動的方案,因此這裏排除。下面所說的緩存,就指的是第二種。
7.怎麼快速對鏈表排序。
8.經常使用的磁盤調度算法有哪些,請舉例說明下
9. TCP 協議和 UDP 協議的區別是什麼。
10.介紹下觀察者模式。
當對象間存在一對多關係時,則使用觀察者模式(Observer Pattern)。好比,當一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬性行爲型模式。
前端題:
全部未說明的情形都可以假設,但要把這個假設說出來;有些問題答案不惟一,請將你知道的答案都寫出來。
1.css有哪些選擇器,如何區分優先級,下面代碼是什麼效果
除了前3中基本選擇器,還有一些擴展選擇器,包括
css選擇器的優先級的定義
基本原則:通常而言,選擇器越特殊,它的優先級越高。也就是選擇器指向的越準確,它的優先級就越高。
複雜的計算方法:
用1表示派生選擇器的優先級
用10表示類選擇器的優先級
用100表示ID選擇器的優先級
div.test1 .span var 優先級 1+10+10+1
span#xxx .songs li 優先級1+100+10+1
#xxx li 優先級 100+1
<style> #id{color:green;} .class-a{ color:blue; } #my-id.class-b{color:yellow;} p.class-a.class-b{ color:red; } </style> <body> <p class="class-b class-a" id="my-id">123</p> </body>
顏色是yellow
2.如何用css 讓一個元素不可見
opacity:0;隱藏對應的元素而且擠佔該元素原來的空間。
display:none;隱藏對應的元素但不擠佔該元素原來的空間。
visibility:hidden;隱藏對應的元素而且擠佔該元素原來的空間。
便是,使用css display:none屬性後,html元素(對象)的寬度,高度等各類屬性值都將「丟失」;而使用visibility:hidden屬性後,html元素(對象)僅僅是在視覺上看不見(徹底透明),而它所佔據的空間位置仍然存在。
3.補充一下 .b的代碼,使得<div class="b"></div>在頁面水平居中,列出你能想到的全部方法
.b{
width:200px;
height:100px;
background:#ccc;
//繼續補充代碼
}
傳統的居中方式:添加代碼margin:0 auto;便可。
絕對定位方式(必須已知子元素寬高,而且父元素須要relative定位),添加代碼:
position: absolute;
left: 50%;
margin-left: -100px;
絕對定位方式(不用知道子元素寬高,但父元素須要relative定位)
position: absolute;
left: 0;
right: 0;
margin: 0 auto;
flex佈局,給父元素添加代碼: display: flex; justify-content: center;
4.若是一個頁面由於圖片大且多加載慢,應該如何去優化?
圖片懶加載,在頁面上的未可視區域能夠添加一個滾動條事件,判斷圖片位置與瀏覽器頂端的距離與頁面的距離,如何前者小於後者,優先加載。
若是爲幻燈片,相冊等,可使用圖片預加載技術,將當前展現圖片的前一張和後一張優先下載。
若是圖片爲css圖片,可使用CSSsprite,SVGsprite,Iconfont,Base64等技術。
若是圖片過大,可使用特殊編碼的圖片,加載時會先加載一張壓縮的特別厲害的縮略圖,以提升用戶體驗。
若是圖片展現區域小於圖片的真實大小,則應在服務器端根據業務須要先行進行圖片壓縮,圖片壓縮後大小與展現一致。
5.如何消除一個數組裏面重復的元素?(請用代碼實現,元素多是數組,字符串等,不考慮function)
首先介紹一種 es6的解決方法,es6裏新添加了兩個很好用的東西,set和Array.from。set是一種新的數據結構,它能夠接收一個數組或者是類數組對象,自動去重其中的重複項目。
var arr = [1,1,'1','1',null,null,undefined,undefined,NaN,NaN];
console.log(new Set(arr));
在這裏咱們能夠看見,重複的項目已經被去掉了,包括NaN。正常狀況下,NaN === NaN返回的是false,可是在set裏,同樣可以幫你去重。
可是這裏你們能夠看到,set返回的是一個對象,可是咱們想要的是數組啊。這時,就該輪到Array.from出場了,它的做用,就是能夠把類數組對象,可迭代對象轉化爲數組。
var arr = [1,1,'1','1',null,null,undefined,undefined,NaN,NaN];
var newArr = Array.from(new Set(arr));
console.log(newArr);
再介紹一種利用indexOf方法的去重,indexOf()方法可返回某個指定的字符串值在字符串中首次出現的位置。
var arr = [1,1,2,3,4,2,6,4,5,7]; var nArr = []; function removeItem(arr) { for(var i=0;i<arr.length;i++){ if(nArr.indexOf(arr[i])==-1){ nArr.push(arr[i]); } } return nArr; } console.log(removeItem(arr));
6.請簡述var let const的區別
var定義的變量能夠修改,若是不初始化會輸出undefined,而且有時候會泄露到全局,形成一些影響
爲了解決這個泄露的bug,有了es6的let,let至關於給行數定義了一個塊級域,函數內部使用let定義的變量只能在函數內部起做用
const是用來定義一個不變的量,不能修改的量,必須賦初值。
7.如何深拷貝對象,JSON.stringfiy須要注意什麼
講講淺拷貝和深拷貝的概念,js中的淺拷貝和深拷貝,知識針對複雜數據類型(Object,Array)的複製問題。
淺拷貝:是拷貝引用,拷貝後的引用都是指向同一個對象的實例,彼此之間的操做會互相影響
var a = {c:1}; var b = a; console.log(a === b); // 輸出true。 a.c = 2; console.log(b.c); // 輸出 2
深拷貝:在堆中從新分配內存,而且把資源對象全部屬性都進行新建拷貝,拷貝後的對象與原來的對象是徹底隔離,互不影響
常見方法有JSON.parse(),JSON.stringify(),jQury的$.extend(true,{},obj)
var a = {c: {d: 1}}; var b = $.extend(true, {}, a); console.log(a === b); // 輸出false a.c.d = 3; console.log(b.c.d); // 輸出 1,沒有改變。
JSON.stringfiy須要注意什麼
首先講一下JSON.parse()和JSON.stringfiy的概念
JSON.parse()是將字符串轉化成json對象
var str = '{"name":"zp","age":"22"}' 結果: JSON.parse(str) Object age: "22" name: "zp" __proto__: Object
JSON.stringfiy則相反,是將json對象轉換成字符串
vara = {a:1,b:2}
結果:
JSON.stringify(a)
"{"a":1,"b":2}"
JSON.stringfiy須要注意的地方
JSON.stringfiy將不會轉換不具備json表示形式的值
數字(整數或浮點數) 字符串(在雙引號中) 邏輯值(true 或 false) 數組(在方括號中) 對象(在花括號中) null
undefined不在其中。
8.<a onclick="a.click">和<a onclick="a.click()">二者的寫法有差異嗎,若是有,差異是什麼
前者調用的是一個函數,當點擊的時候能夠執行函數;然後者只是將函數運行後的值賦值給了a,因此當點擊的時候並不會執行函數。
9.按時間順序排序的日誌信息,如何快速找到指定時間的日誌。時間複雜度是多少
是數據結構中的日誌信息
10.寫一個fiter函數執行器,第一個參數爲filter函數,剩餘的參數傳入filter執行,並返回結果,exefilter()
首先看看js filter()的用法,array.filter(function(currentValue,index,arr),thisValue)
參數描述:
function(currentValue,index,arr)
currentValue 必須。當前元素的值
index可選。當前選擇的索引值
array可選。當前元素屬於的數組對象
thisValue可選。對象做爲該執行回調時使用,傳遞給函數,用做」this「的值。若是省略了 thisValue,」this「的值爲」undefined「
var ages = [32, 33, 16, 40]; function exeFilter(age) { return age >= 18; } function myFunction() { document.getElementById("demo").innerHTML = ages.filter(exeFilter); }