大廠前端面試題

一、[單選題] 有如下 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,達到下面的效果  

// Should equal 15 
sum(1, 2, 3, 4, 5); 
// Should equal 0 
sum(5, null, -5); 
// Should equal 10 
sum('1.0', false, 1, true, 1, 'A', 1, 'B', 1, 'C', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1); 
// Should equal 0.3, not 0.30000000000000004 
sum(0.1, 0.2)

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) {
  ?
}
obj.? = "name2";
var a = obj("name1");
var b = new obj; 
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):漢譯爲搜索引擎優化。是一種方式:利用搜索引擎的規則提升網站在有關搜索引擎內的天然排名。

目的是讓其在行業內佔據領先地位,得到品牌收益。很大程度上是網站經營者的一種商業行爲,將本身或本身公司的排名前移。
 
20、[問答題] js 對象的深度克隆代碼實現。 
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的過程)

  • 用戶發出異步請求
  • 建立 XMLHttpRequest 對象
  • 告訴 XMLHttpRequest 對象哪一個函數會處理  XMLHttpRequest 對象狀態的改變,爲此要把對象的 onReadyStateChange 屬性設置爲響應該事件的 JavaScript 函數的引用
  • 建立請求,用 open 方法指定是get仍是post,是否異步,url地址
  • 發送請求,send方法
  • 接收結果並分析
  • 實現刷新

(3)同步和異步的區別:

  • 同步:腳本會停留並等待服務器發送回覆而後在繼續
  • 異步:腳本容許頁面繼續其進程並處理可能的回覆

(4)跨域問題的解決:

  • 使用 document.domain + iframe 解決跨子域問題
  • 使用 window.name
  • 使用 flash
  • 使用 iframe + location.hase
  • 使用 html5 的 postMessage
  • 使用 jsonp (建立動態 script)

 

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 阻塞? 

(1)js的阻塞特性:
  全部瀏覽器在下載JS的時候,會阻止一切其餘活動,好比其餘資源的下載,內容的呈現等等。
  直到JS下載、解析、執行完畢後纔開始繼續並行下載其餘資源並呈現內容。
  爲了提升用戶體驗,新一代瀏覽器都支持並行下載JS,可是JS下載仍然會阻塞其它資源的下載(例如.圖片,css文件等)。
因爲瀏覽器爲了防止出現JS修改DOM樹,須要從新構建DOM樹的狀況,因此就會阻塞其餘的下載和呈現。
嵌入JS會阻塞全部內容的呈現,而外部JS只會阻塞其後內容的顯示,2種方式都會阻塞其後資源的下載。
也就是說外部樣式不會阻塞外部腳本的加載,但會阻塞外部腳本的執行。
 
(2)CSS怎麼會阻塞加載了?
CSS原本是能夠並行下載的,在什麼狀況下會出現阻塞加載了(在測試觀察中,IE6下CSS都是阻塞加載)
  • 當CSS後面跟着嵌入的JS的時候,該CSS就會出現阻塞後面資源下載的狀況;
  • 而當把嵌入JS放到CSS前面,就不會出現阻塞的狀況了。
根本緣由:
  • 由於瀏覽器會維持html中css和js的順序,樣式表必須在嵌入的JS執行前先加載、解析完。
  • 而嵌入的JS會阻塞後面的資源加載,因此就會出現上面CSS阻塞下載的狀況。
嵌入JS應該放在什麼位置?
  • 放在底部,雖然放在底部照樣會阻塞全部呈現,但不會阻塞資源下載。
  • 若是嵌入JS放在head中,請把嵌入JS放在CSS頭部。
  • 使用defer(只支持IE)
  • 不要在嵌入的JS中調用運行時間較長的函數,若是必定要用,能夠用`setTimeout`來調用

 

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(); 

請問以上程序的輸出是()

A.010 
B.012 
C.000 
D.011
答案:A
  這是一個閉包,閉包能夠用在許多地方。它的最大用處有兩個,一個是能夠讀取函數內部的變量,另外一個就是讓這些變量的值始終保持在內存中。
  這裏的局部變量 i ,對 f1() 來講是全局變量,對 f2() 來講也是全局變量,可是 f1() 的 i 和 f2() 的 i 有事相互獨立不可見的,f1() 每執行一次,f1() 的 i 就加 1 ,f2() 每執行一次,f2() 的 i 就加 1,可是相互之間不影響,所以是 010
 
3四、[單選題]  如下 Js 程序的輸出是什麼() 
var a = "undefined";
var b = "false";
var c = "";
function assert(aVar) {
  if (aVar)
    alert(true);
  else
    alert(false);
}
assert(a);
assert(b);
assert(c); 
A.true,true,true 
B.true,true,false 
C.false,false,true 
D.false,false,false 
答案:B
  undefined 和 false 都是 JavaScript的數據類型,可是用雙引號引發了就是字符串了,空串至關於 false,不然是 true
 
3五、[問答題]  請實現 javascript 中的 indexOf 功能,判斷一個字符串 a 中是否包含另外一個字符串 b。 
a)若是包含,須要返回匹配字符串 b 的位置。 
b)若是不包含,須要返回-1。 
如:indexOf("hello","el") return 1。 
// 方法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(); 

程序的輸出是什麼?

A.bar bar bar bar 
B.bar bar bar undefined 
C.bar bar undefined bar 
D.undefined bar undefined bar 
答案:C
方法/函數是由誰(對象)調用的,方法/函數內部的this就是指向誰(對象)
注意:是被誰調用,不是處於誰的做用域,即便在做用域
一、func 是由 myObject 調用的,this 指向 myObject 
二、self 指向 myObject ,至關於 myObject 的this副本
三、這個當即執行匿名函數表達式(IIFE)是由window調用的,this指向window
四、IIEF 的做用域處於 myObject 的做用域中,本做用域找不到 self 變量,沿着做用域鏈向上查找 self 變量,找到了指向 myObject 的self
 
 
3七、[不定項選擇題] 下面有關 javascript 內部對象的描述,正確的有?
A.History 對象包含用戶(在瀏覽器窗口中)訪問過的 URL 
B.Location 對象包含有關當前 URL 的信息 
C.Window 對象表示瀏覽器中打開的窗口 
D.Navigator 對象包含有關瀏覽器的信息 
答案:ABCD
Navagator:提供有關瀏覽器的信息。
Window:Window對象處於對象層次的最頂層,它提供了處理Navagator窗口的方法和屬性。
Location:提供了與當前打開的URL一塊兒工做的方法和屬性,是一個靜態的對象。
History:提供了與歷史清單有關的信息。
Document:包含與文檔元素一塊兒工做的對象,它將這些元素封裝起來供編程人員使用。
 
3八、[單選題] js 中字符串鏈接用那個比較高效? 
A.a+=b 
B.a = a+b 
C.Array.join() 
D.Array.push()
答案:C
JavaScript中字符串鏈接時用 Array.join() 替換 string += "xx" ,換來幾十倍的速度提高
 
3九、[單選題]  在 文 件 /home/somebody/workspace/somemodule.js 中 第 一 行 引 用 了 一 個 模 塊 : require(‘othermodule‘),請問 required 的查找模塊的順序 
A. /home/somebody/workspace/mode_modules/othermodule/index.js  
B. /home/somebody/workspace/mode_modules/othermodule. Js  
C.CORE MODULES named othermodule  
D./home/somebody/mode_modules/othermodule/index.js 
 
A.C D A B 
B.C B D A 
C.C B A D 
D.C D B A 
答案:C
(1)首先,Node在當前目錄下查找 package.json(CommonJS包規範定義的包描述文件),經過 JSON.parse() 解析出包描述對象,從中取出 main 屬性指定的文件名進行定位。若是文件確實擴展名,將會進入擴展名分析的步驟。
(2)若是 main 屬性制定的文件名錯誤,或者壓根沒有 package.json 文件,Node會將 index當作默認文件名,而後依次查找 index.js   index.node   index.json
(3)若是在目錄分析的過程當中沒有定位成功任何文件,則自定義模塊進入下一個路徑進行查找。若是模塊路徑數組都被遍歷完畢,依然沒有查找到目標文件,則會拋出查找失敗異常。
 
  按照上面的思路,首先應該查找 package.json 文件,看看裏面有沒有核心模塊,應該是 C 最早,
othermodule不是核心模塊,那麼接着應該進入擴展名分析的步驟,就應該是查找 othermodule.js,對應B
緊接着就是以 index 爲默認文件名,也就是A,
再接下來就是上一個文件目錄 D 了
 
40、[單選題]以下代碼輸出的結果是什麼: 
console.log(1 + "2" + "2");
console.log(1 + +"2" + "2");
console.log("A" - "B" + "2");
console.log("A" - "B" + 2); 
A.122 122 NaN NaN 
B.122 32 NaN NaN2 
C.122 32 NaN2 NaN 
D.122 32 NaN2 NaN2 
答案:C
(1)console.log(1+"2"+"2")
作加法時要注意雙引號,當使用雙引號時,JavaScript認爲是字符串,字符串相加等於字符串合併
(2)console.log(1 + + "2" + "2")
第一個 + "2" 中的加號是一元加操做符,+"2" 會變成數值 2,所以 1 + + "2" 至關於 1+2=3
(3)console.log("A" - "B" + "2")
"A"-"B"的運算中,須要先把 "A" 和 "B" 用 Number函數轉換成數值,其結果是 NaN,在減法操做中,若是有一個是 NaN,則結果是NaN,所以 "A"-"B"結果爲 NaN
而後和 「2」 進行字符串拼接,變成了 NaN2
(4)console.log("A"-"B" + 2)
根據上述,"A"-"B"的結果爲 NaN,而後和數值2進行加法操做,在加法操做中,若是有一個操做數是 NaN,則結果爲 NaN
 
4一、[不定項選擇題] 下列關於比較 Ajax 與 Flash 的優缺點,相關描述正確的是? 
A.Ajax 的優點在乎在於可搜索性,開放性,易用性及易於開發 
B.Flash 的優點在於多媒體處理,能夠更容易的調用瀏覽器之外的外部資源 
C.Ajax 最主要的批評就是它可能破壞瀏覽器的後退功能 
D.flash 文件常常會很大,用戶第一次使用的時候須要忍耐較長的等待時間 
答案:ABCD
(1)Ajax的優點:1.可搜索性 2.開放性 3.費用 4.易用性 5.易於開發
(2)Flash的優點:1.多媒體處理 2.兼容性 3.矢量圖形 4.客戶端資源調度
(3)Ajax的劣勢:1.它可能破壞瀏覽器的後退功能  2.使用動態頁面更新使得用戶難於將某個特定的狀態保存到收藏夾中   ---不過這些都有相關方法解決
(4)Flash的劣勢:1.二進制格式  2.格式私有  3.flash文件常常會很大,用戶第一次使用的時候須要忍耐較長的等待時間   4.性能問題
 
4二、[不定項選擇題]  下面哪些語句能夠在 JS 裏判斷一個對象 oStringObject 是否爲 String。 
A.oStringObject instanceof String 
B.typeof oStringObject == 'string'
C.oStringObject is String
D.以上答案都不正確 
答案:A
一般來講判斷一個對象的類型使用 typeof,可是在 new String 的狀況下,結果會是 object 此時須要經過 instanceof 來判斷
 
4三、[問答題]  Flappy Bird 是風靡一時的手機遊戲,玩家要操做一隻小鳥穿過無窮無盡的由鋼管組成的 障礙。若是要你在 HTML 前端開發這個遊戲,爲了保證遊戲的流暢運行,並長時間運行也不 會崩潰,請列舉開發要注意的性能問題和解決的方法。 
(1)長時間運行會崩潰的緣由就是 ‘內存泄漏’。咱們在平常的JS程序中並不太在乎內存泄漏問題,由於JS解釋器會有垃圾回收機制,大部分無效內存會被回收,另外一方面JS運行在客戶端,即便出現內存泄漏也不是太大的問題,簡單的刷新頁面便可。可是若是要預防內存泄漏的場景仍是要注意一些問題。
(2)針對這個場景來講,即便長期運行出現內存泄漏的可能仍是很低。第一方面,數據量不多,水管維護一個數組便可,而後每隔一段時間更新數組,來達到水管長度不一樣的效果。小鳥只要維護一個對象便可。經過移動水管檢查碰撞就能夠實現遊戲邏輯。由於在瀏覽器端,JS程序和頁面UI渲染公用一條線程,若是計算時間過長會使渲染阻塞,在HTML5中利用 webworker 已經能夠開闢一個新線程專門負責計算解決這個問題了。
 
4四、[問答題]  如下代碼輸出的值爲?( )
function f1() {
  var n = 100;
  nAdd = function () {
    n += 1
  }
  function f2() {
    alert(n);
  }
  return f2;
}
var result = f1();
result();
nAdd();
result(); 

輸出:100   undefined   100

相關文章
相關標籤/搜索