一、[單選題] 有如下 ES6 代碼 javascript
function * gen() { yield 1; yield 2; yield 3; }
下面選項描述正確的是哪一個? css
A.gen()執行後返回 2html
B.gen()執行後返回 undefined前端
C.gen()執行後返回一個 Generator 對象html5
D.gen()執行後返回 1java
答案:Cnode
提示:這是 ES6 的新 feature, function 後面帶 * 的叫作 generator function。函數運行時, 返回一個迭代器。 web
二、[不定項選擇題] 語句 var arr=[a,b,c,d];執行後,數組 arr 中每項都是一個整數,下面獲得其中最大整數語 句正確的是哪幾項? ajax
A.Math.max(arr)數據庫
B.Math.max(arr[0], arr[1], arr[2], arr[3])
C.Math.max.call(Math, arr[0], arr[1], arr[2], arr[3])
D.Math.max.apply(Math,arr)
答案:B C D
提示: A 選項錯誤
由於函數 Math.max(x);的參數是 Number 類型,可使小數,整數,正數,負數或者是 0.若是不是上面所述類型就會返回 NaN.
三、[問答題] 寫一個 traverse 函數,輸出全部頁面寬度和高度大於 50 像素的節點。
<script language="javascript"> function traverse() { var arr = []; var elements = []; if (document.all) { elements = document.all; } else { elements = document.getElementsByTagName("*"); } for (var i = 0; i < elements.length; i++) { var ele = elements[i]; // width 返回的是字符串 offsetWidth 返回的是帶邊框的 Number 型的數字 var width = parseFloat(ele.style.width) || ele.offsetWidth; var height = parseFloat(ele.style.height) || ele.offsetHeight; if (width > 50 && height > 50) { arr.push(elements[i].tagName); } } return arr; } window.onload = function () { console.log(traverse()); console.log("a"); console.log('a'); } </script>
四、[問答題] 請寫一個表格以及對應的 CSS,使表格奇數行爲白色背景,偶數行爲灰色背景,鼠標移 上去時爲黃色背景。
<table> <tr><td>第一行</td></tr> <tr><td>第二行</td></tr> <tr><td>第三行</td></tr> <tr><td>第四行</td></tr> <tr><td>第五行</td></tr> </table> table tr:nth-child(odd){ background-color: white; } table tr:nth-child(even){ background-color: gray; } table tr:hover{ background-color: yellow; }
五、[問答題] 寫一個求和的函數 sum,達到下面的效果
function sum() { var nResult = 0; for (var i = 0, l = arguments.length; i < l; i++) { nResult += window.parseFloat(arguments[i]) || 0; } return nResult.toFixed(3) * 1000 / 1000; }
六、[填空題] 刪除給定數組中的第二項和第三項,而且在獲得的新的數組中第二項後面添加一個新的 值:
var arr1 = ['a','b','c','d','e'];
var arr2 = arr1. 1 ( 2 , 3 ,'newvalue')
var arr1 = ['a','b','c','d','e']; var arr2 = arr1.splice( 1,2 ,'newvalue') console.log(arr1);
七、[填空題] 在空白處填入適當的代碼使輸出結果成立:
function showMoney() { 1 }; var personA = new Object; var personB = new Object; personA.money = "100"; personB.money = "150"; personA.showMoney = showMoney; personB.showMoney = showMoney; // 輸出結果: personA.showMoney(); //"100" personB.showMoney(); //"150"
答案: return this.money
八、[填空題] 使用 for in 循環數組中的元素會枚舉原型鏈上的全部屬性,過濾這些屬性的方式是使 用 ? 函數
hasOwnProperty
九、[問答題] 請實現一個 fibonacci 函數,要求其參數和返回值以下所示:
/** * @desc: fibonacci * @param: count {Number} * @return: result {Number} * 第 count 個 fibonacci 值,計數從 0 開始 * fibonacci 數列爲:[1, 1, 2, 3, 5, 8, 13, 21, 34 „] * 則 getNthFibonacci(0)返回值爲 1 * 則 getNthFibonacci(4)返回值爲 5 */ function getNthFibonacci(count) { if (count <= 1) { return 1; } return getNthFibonacci(count - 1) + getNthFibonacci(count - 2); }
十、[填空題]
輸出對象中值大於 2 的 key 的數組
var data = {a: 1, b: 2, c: 3, d: 4};
Object.keys(data).filter(function(x) { return ? ;})
期待輸出:[「c」,」d」]
答案: data[x] > 2
十一、[填空題] 填寫內容讓下面代碼支持 a.name = 「name1」; b.name = 「name2」;
function obj(name) { if(name){ this.name = name } return this } obj.prototype.name = "name2"; var a = obj("name1"); var b = new obj;
十二、JavaScript語言特性中,有不少方面和咱們接觸的其餘編程語言不太同樣,好比說,JavaScript語言實現繼承機制的核心就是 《prototype》,而不是Java語言那樣的類式繼承。JavaScript解析引擎在讀取一個 Object 的屬性的值時,有沿着《原型鏈》向上尋找,若是最終沒有找到,則該屬性值爲《undefined》;若是最終找到該屬性的值,則返回結果。與這個過程不一樣的是,當JavaScript解析引擎執行「給一個Object的某個屬性賦值」的時候,若是當前Object存在該屬性,則改寫該屬性的值,若是當前的Object自己並不存在該屬性,則賦值該屬性的值。
1三、[單選題] 下面有關 html 的描述,不推薦的是?
A.在頁面頂部添加 doctype 聲明;
B.在 </head> „ <body> 中間插入 HTML 代碼;
C.避免使用 <font> 標籤;
D.使用 <table> 元素展示學生成績表等數據。
答案:B
1四、[單選題] 下面關於 CSS 佈局的描述,不正確的是?
A.塊級元素實際佔用的寬度與它的 width 屬性有關;
B.塊級元素實際佔用的寬度與它的 border 屬性有關;
C.塊級元素實際佔用的寬度與它的 padding 屬性有關;
D.塊級元素實際佔用的寬度與它的 background 屬性有關。
答案:D
15:、[單選題]下列事件哪一個不是由鼠標觸發的事件()
A.click
B.contextmenu
C.mouseout
D.keydown
答案:D
1六、[問答題] 請說說 cache-control 是怎麼回事?
網頁的緩存是有 HTTP 消息頭中的 「Cache-control」 來控制的,常見的取值有 private 、no-cache、max-age、must-revalidate 等,默認爲 private
Expires 頭部字段提供一個日期和時間,響應在該日期和時間後被認爲失效。容許客戶端在這個時間以前不去檢查(發請求),等同 max-age 的效果。可是若是同時存在,則被 Cache-Control 的 max-age 覆蓋
Expires = "Expires" : "HTTP-date"
例如: Expires: Thu,01 Dec 1994 16:00:00 GMT (必須是GMT格式)
若是把它設置爲-1,則表示當即過時
Expires 和 max-age 均可以用來指定文檔的過時時間,可是兩者有一些細微差異
1.Expires 在 HTTP/1.0 中已經定義,Cache-Control:max-age 在HTTP/1.1中才有定義,爲了向下兼容,僅使用 max-age不夠。
2.Expires 指定一個絕對的過時時間(GMT 格式),這麼作會致使至少 2 個問題:
2.1 客戶端和服務器時間不一樣步致使 Expires 的配置出現問題。
2.2 很容易在配置後忘記具體的過時時間,致使過時來臨出現浪涌現象
3. max-age 指定的是從文檔被訪問後的存活時間,這個時間是個相對值(好比:3600s), 相對的是文檔第一次被請求時服務器記錄的 Request_time(請求時間)
4. Expires 指定的時間能夠是相對文件的最後訪問時間(Atime)或者修改時間(MTime),而 max-age 相對對的是文檔的請求時間(Atime)
5.若是值爲 no-cache,那麼每次都會訪問服務器。若是值爲 max-age,則在過時以前不 會重複訪問服務器。
1七、[問答題] 你瞭解 HTTP 狀態碼嗎,請隨便介紹一下。
100 Continue 繼續,通常在發送 post 請求時,已發送了 http header 以後服務端將返回 此信息,表示確認,以後發送具體參數信息
200 OK 正常返回信息
201 Created 請求成功而且服務器建立了新的資源
202 Accepted 服務器已接受請求,但還沒有處理
301 Moved Permanently 請求的網頁已永久移動到新位置
302 Found 臨時性重定向
303 See Other 臨時性重定向,且老是使用 GET 請求新的 URI
304 Not Modified 自從上次請求後,請求的網頁未修改過
400 Bad Request 服務器沒法理解請求的格式,客戶端不該當嘗試再次使用相同的內容 發起請求
401 Unauthorized 請求未受權
403 Forbidden 禁止訪問
404 Not Found 找不到如何與 URI 相匹配的資源
500 Internal Server Error 最多見的服務器端錯誤
503 Service Unavailable 服務器端暫時沒法處理請求(多是過載或維護)
1八、[問答題] 如何獲取 UA?
經過JS獲取瀏覽器UA(User Agent,用戶代理)
//獲取完整的瀏覽器名稱 document.Browser.Name.value=navigator.appName; //獲取瀏覽器的版本,通常不與實際的瀏覽器版本對應 document.Browser.Version.value=navigator.appVersion; //獲取瀏覽器的名稱。一般都是Mozilla,即便在非Mozilla的瀏覽器中也是如此 document.Browser.Code.value=navigator.appCodeName; //獲取瀏覽器的用戶代理字符串 document.Browser.Agent.value=navigator.userAgent;
1九、[問答題] 說說對網站重構的理解。
網站重構:在不改變外部行爲的前提下,簡化結構、添加可讀性,而在網站前端保持一致性的行爲。也就是說在不改變UI的狀況下,對網站進行優化,在擴展的同時保持一致性的UI
對於傳統的網站來講,重構一般是:
(1)表格(table)佈局改成 DIV + CSS
(2)使網頁前端兼容於現代瀏覽器(針對於不合規範的CSS、如對 IE6 有效的)
(3)對於移動平臺的優化
(4)針對SEO進行優化
(5)深層次的網站重構應該考慮的方面
(6)減小代碼的耦合
(7)讓代碼保持彈性
(8)嚴格按規範編寫代碼
(9)設計可擴展的API
(10)代替舊有的框架、語言
(11)加強用戶體驗
(12)一般來講對於速度的優化也包含在重構中
(13)壓縮JS、CSS、image 等前端資源(一般是由服務器來解決的)
(14)程序的性能優化(如數據讀寫)
(15)採用CDN來加速資源加載
(16)對於 JS DOM 的優化
(17)HTTP服務器的文件緩存
SEO:(Search Engine Optimization):漢譯爲搜索引擎優化。是一種方式:利用搜索引擎的規則提升網站在有關搜索引擎內的天然排名。
function clone(obj) { let ret if (Array.isArray(obj)) { ret = [] // 建立一個空數組 for (let i = 0; i < obj.length; i++) { ret[i] = clone(obj[i]) } return ret } else if (Object.prototype.toString.call(obj) === "[object Object]") { ret = {} // 建立一個空對象 for (let i in obj) { ret[i] = clone(obj[i]) } return ret } else { return obj } }
2一、[問答題] Ajax 是什麼?Ajax 的交互模型?同步和異步的區別?如何解決跨域問題?
(1)ajax 的全稱是異步的 JavaScript 和 XML ,是一種建立快速動態的技術,經過在後臺與服務器進行少許數據交互,實現網頁的異步更新,在不從新加載整個界面的狀況下,作到網頁的部分刷新
(2)ajax的交互模型(ajax的過程)
(3)同步和異步的區別:
(4)跨域問題的解決:
2二、[問答題] IE 與火狐的事件機制有什麼區別? 如何阻止冒泡?
(1)咱們在網頁中的某個操做(有的操做對應多個事件)。例如:當咱們點擊一個按鈕就會產生一個事件。是能夠被JavaScript偵測到的行爲
(2)事件處理機制:IE是事件冒泡,firefox 同時支持兩種事件模型(捕獲型事件和冒泡型事件)
(3)ev.stopPropagation() ---注意舊 ie 的方法:ev.cancelBubble = true
2三、[問答題] WEB 應用從服務器主動推送 Data 到客戶端有那些方式?
(1)html5 websoket
(2)websocket 經過 flash
(3)XHR 長時間鏈接
(4)XHR Multipart Streaming
(5)不可見的 Iframe
(6)<sctipt>標籤的長時間鏈接(可跨域)
2四、[問答題] JavaScript 原型,原型鏈 ? 有什麼特色?
(1)原型對象也是普通的對象,是對象一個自帶隱式的 __proto__ 屬性,原型也有可能有本身的原型,若是一個原型對象的原型不爲 null 的話,咱們就稱之爲原型鏈
(2)原型鏈是由一些用來繼承和共享屬性的對象組成的(有限的)對象鏈
2五、[問答題] Node.js 的適用場景
(1)高併發
(2)聊天
(3)實時消息推送
2六、[問答題] eval 是作什麼的,有什麼建議?
(1)它的功能是把對應的字符串解析成 JS 代碼並運行
(2)應該避免使用eval,不安全,很是耗性能(2次,一次解析成js語句,一次執行)
2七、[問答題] 哪些地方會出現 css 阻塞,哪些地方會出現 js 阻塞?
2八、[問答題] GET 和 POST 的區別,什麼時候使用 POST?
GET:通常用於信息獲取,使用URL傳遞參數,對所發送的信息數量有限制,通常在 2000 個字符
POST:通常用於修改服務器上的資源,對所發送的信息沒有限制
GET方式須要使用 Request.QueryString 來取得變量的值
POST方式經過 Request.Form 來獲取變量的值
也就是說Get是經過地址欄來傳值,而Post是經過提交表單來傳值
在如下狀況下,使用POST請求:
(1)沒法使用緩存文件(更新服務器上的文件或數據庫)
(2)向服務器發送大量數據(POST沒有數據量限制)
(3)發送包含未知字符的用戶輸入時,POST比GET更穩定也更可靠
2九、[問答題] 請解釋一下 JavaScript 的同源策略。
同源策略是客戶端腳本(尤爲是JavaScript)的重要安全度量標準。其目的是防止某個文檔或腳本從多個不一樣源裝載。
這裏的同源策略指的是:協議、域名、端口號相同,同源策略是一種安全協議,指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。
爲何要有同源限制:
咱們舉例說明:好比一個黑客程序,他利用 Iframe 把真正的銀行登陸頁面嵌入他的頁面上,當你使用真實的用戶名、密碼登陸時,他的頁面就能夠經過JavaScript讀取到你的表單中input中的內容,這樣用戶名、密碼就輕鬆到手了。
30、[問答題] 什麼叫優雅降級和漸進加強?
(1)優雅降級:Web站點在全部新式瀏覽器中都能正常工做,若是用戶使用的是老式瀏覽器,則代碼會檢查以確認它們是否能正常工做。因爲 IE 獨特的盒模型佈局問題,針對不一樣版本的 IE 的 hack實踐過優雅降級了,爲那些沒法支持功能的瀏覽器增長候選方案,使之在舊式瀏覽器上以某種形式降級體驗卻不至於徹底失效。
(2)漸進加強:從被全部瀏覽器支持的基本功能開始,逐步地添加那些只有新式瀏覽器才支持的功能,向頁面增長無害於基礎瀏覽器的額外樣式和功能。當瀏覽器支持時,它們會自動地呈現出來併發揮做用。
3一、[問答題] 哪些操做會形成內存泄漏?
內存泄漏指任何對象在你不在擁有或須要它以後仍然存在。
垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用爲0(沒有其餘對象引用過該對象),或對該對象的惟一引用是循環的,那麼該對象的內存便可回收。
(1)setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏
(2)閉包
(3)控制檯日誌
(4)循環引用(在兩個對象彼此引用且彼此保留時,就會產生一個循環引用)
3二、[問答題] .call() 和 .apply() 的做用?
動態改變某個類的某個方法的運行環境
3三、[單選題]
function Foo() { var i = 0; return function () { document.write(i++); } } var f1 = Foo(), f2 = Foo(); f1(); f1(); f2();
請問以上程序的輸出是()
var a = "undefined"; var b = "false"; var c = ""; function assert(aVar) { if (aVar) alert(true); else alert(false); } assert(a); assert(b); assert(c);
// 方法1 function indexOf(str, subStr){ var ret = str.match(subStr) return ret ? ret.index : -1 } // 方法2 function indexOf(a, b){ return a.search(b) }
3六、[單選題]
var myObject = { foo: "bar", func: function () { var self = this; console.log(this.foo); console.log(self.foo); (function () { console.log(this.foo); console.log(self.foo); }()); } }; myObject.func();
程序的輸出是什麼?
console.log(1 + "2" + "2"); console.log(1 + +"2" + "2"); console.log("A" - "B" + "2"); console.log("A" - "B" + 2);
function f1() { var n = 100; nAdd = function () { n += 1 } function f2() { alert(n); } return f2; } var result = f1(); result(); nAdd(); result();
輸出:100 undefined 100