前端基礎面試題(js部分)

 

前端基礎面試題(JS部分)

 

1.幾種基本數據類型?複雜數據類型?值類型和引用數據類型?堆棧數據結構?javascript

基本數據類型:Undefined、Null、Boolean、Number、String
值類型:數值、布爾值、null、undefined。
引用類型:對象、數組、函數。
堆棧數據結構:是一種支持後進先出(LIFO)的集合,即後被插入的數據,先被取出!
js數組中提供瞭如下幾個方法可讓咱們很方便實現堆棧:
shift:從數組中把第一個元素刪除,並返回這個元素的值。
unshift: 在數組的開頭添加一個或更多元素,並返回新的長度
push:在數組的中末尾添加元素,並返回新的長度
pop:從數組中把最後一個元素刪除,並返回這個元素的值。php

2.聲明函數做用提高?聲明變量和聲明函數的提高有什麼區別?css

(1) 變量聲明提高:變量申明在進入執行上下文就完成了。
只要變量在代碼中進行了聲明,不管它在哪一個位置上進行聲明, js引擎都會將它的聲明放在範圍做用域的頂部;html

(2) 函數聲明提高:執行代碼以前會先讀取函數聲明,意味着能夠把函數申明放在調用它的語句後面。
只要函數在代碼中進行了聲明,不管它在哪一個位置上進行聲明, js引擎都會將它的聲明放在範圍做用域的頂部;前端

(3) 變量or函數聲明:函數聲明會覆蓋變量聲明,但不會覆蓋變量賦值。
同一個名稱標識a,即有變量聲明var a,又有函數聲明function a() {},無論兩者聲明的順序,函數聲明會覆蓋變量聲明,也就是說,此時a的值是聲明的函數function a() {}。注意:若是在變量聲明的同時初始化a,或是以後對a進行賦值,此時a的值變量的值。eg: var a; var c = 1; a = 1; function a() { return true; } console.log(a);java

3.判斷數據類型?node

typeof返回的類型都是字符串形式,能夠判斷function的類型;在判斷除Object類型的對象時比較方便。
判斷已知對象類型的方法: instanceof,後面必定要是對象類型,而且大小寫不能錯,該方法適合一些條件選擇或分支。jquery

4.異步編程?webpack

方法1:回調函數,優勢是簡單、容易理解和部署,缺點是不利於代碼的閱讀和維護,各個部分之間高度耦合(Coupling),流程會很混亂,並且每一個任務只能指定一個回調函數。git

方法2:時間監聽,能夠綁定多個事件,每一個事件能夠指定多個回調函數,並且能夠「去耦合」(Decoupling),有利於實現模塊化。缺點是整個程序都要變成事件驅動型,運行流程會變得很不清晰。

方法3:發佈/訂閱,性質與「事件監聽」相似,可是明顯優於後者。

方法4:Promises對象,是CommonJS工做組提出的一種規範,目的是爲異步編程提供統一接口。
簡單說,它的思想是,每個異步任務返回一個Promise對象,該對象有一個then方法,容許指定回調函數。

5.事件流?事件捕獲?事件冒泡?

事件流:從頁面中接收事件的順序。也就是說當一個事件產生時,這個事件的傳播過程,就是事件流。

IE中的事件流叫事件冒泡;事件冒泡:事件開始時由最具體的元素接收,而後逐級向上傳播到較爲不具體的節點(文檔)。對於html來講,就是當一個元素產生了一個事件,它會把這個事件傳遞給它的父元素,父元素接收到了以後,還要繼續傳遞給它的上一級元素,就這樣一直傳播到document對象(親測如今的瀏覽器到window對象,只有IE8及下不這樣

事件捕獲是不太具體的元素應該更早接受到事件,而最具體的節點應該最後接收到事件。他們的用意是在事件到達目標以前就捕獲它;也就是跟冒泡的過程正好相反,以html的click事件爲例,document對象(DOM級規範要求從document開始傳播,可是如今的瀏覽器是從window對象開始的)最早接收到click事件的而後事件沿着DOM樹依次向下傳播,一直傳播到事件的實際目標;

6.如何清除一個定時器?

window.clearInterval();
window.clearTimeout();

7.如何添加一個dom對象到body中?innerHTML和innerText區別?

body.appendChild(dom元素);
innerHTML:從對象的起始位置到終止位置的所有內容,包括Html標籤。
innerText:從起始位置到終止位置的內容, 但它去除Html標籤
分別簡述五個window對象、屬性

成員對象
window.event window.document window.history
window.screen window.navigator window.external
Window對象的屬性以下:
window //窗戶自身
window.self //引用本窗戶window=window.self
window.name //爲窗戶命名
window.defaultStatus //設定窗戶狀態欄信息
window.location //URL地址,配備佈置這個屬性能夠打開新的頁面

8.數據持久化技術(ajax)?簡述ajax流程

1)客戶端產生js的事件
2)建立XMLHttpRequest對象
3)對XMLHttpRequest進行配置
4)經過AJAX引擎發送異步請求
5)服務器端接收請求而且處理請求,返回html或者xml內容
6)XML調用一個callback()處理響應回來的內容
7)頁面局部刷新

9.回調函數?

回調函數就是一個經過函數指針調用的函數。若是你把函數的指針(地址)做爲參數傳遞給另外一個函數,當這個指針被用來調用其所指向的函數時,咱們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

10.什麼是閉包? 堆棧溢出有什麼區別? 內存泄漏? 那些操做會形成內存泄漏?怎麼樣防止內存泄漏?*

閉包:就是可以讀取其餘函數內部變量的函數。
堆棧溢出:就是不顧堆棧中分配的局部數據塊大小,向該數據塊寫入了過多的數據,致使數據越界,結果覆蓋了別的數據。常常會在遞歸中發生。
內存泄露是指:用動態存儲分配函數內存空間,在使用完畢後未釋放,致使一直佔據該內存單元。直到程序結束。指任何對象在您再也不擁有或須要它以後仍然存在。

形成內存泄漏:
setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。
閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
防止內存泄露:
一、不要動態綁定事件;
二、不要在動態添加,或者會被動態移除的dom上綁事件,用事件冒泡在父容器監聽事件;
三、若是要違反上面的原則,必須提供destroy方法,保證移除dom後事件也被移除,這點能夠參考Backbone的源代碼,作的比較好;
四、單例化,少建立dom,少綁事件。

11.平時工做中怎麼樣進行數據交互?若是後臺沒有提供數據怎麼樣進行開發?mock數據與後臺返回的格式不一樣意怎麼辦?

由後臺編寫接口文檔、提供數據接口實、前臺經過ajax訪問實現數據交互;
在沒有數據的狀況下尋找後臺提供靜態數據或者本身定義mock數據;
返回數據不統一時編寫映射文件 對數據進行映射。

12 簡述ajax執行流程

基本步驟:
var xhr =null;//建立對象 if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.open(「方式」,」地址」,」標誌位」);//初始化請求 xhr.setRequestHeader(「」,」」);//設置http頭信息 xhr.onreadystatechange =function(){}//指定回調函數 xhr.send();//發送請求 

13.自執行函數?用於什麼場景?好處?

自執行函數:一、聲明一個匿名函數二、立刻調用這個匿名函數。
做用:建立一個獨立的做用域。

好處:防止變量彌散到全局,以避免各類js庫衝突。隔離做用域避免污染,或者截斷做用域鏈,避免閉包形成引用變量沒法釋放。利用當即執行特性,返回須要的業務函數或對象,避免每次經過條件判斷來處理

場景:通常用於框架、插件等場景

14.html和xhtml有什麼區別?

HTML是一種基本的WEB網頁設計語言,XHTML是一個基於XML的標記語言。
1.XHTML 元素必須被正確地嵌套。
2.XHTML 元素必須被關閉。
3.標籤名必須用小寫字母。
4.空標籤也必須被關閉。
5.XHTML 文檔必須擁有根元素。

15. 什麼是構造函數?與普通函數有什麼區別?

構造函數:是一種特殊的方法、主要用來建立對象時初始化對象,總與new運算符一塊兒使用,建立對象的語句中構造函數的函數名必須與類名徹底相同。
與普通函數相比只能由new關鍵字調用,構造函數是類的標示

16. 經過new建立一個對象的時候,函數內部有哪些改變

function Person(){} Person.prototype.friend = []; Person.prototype.name = ''; // var a = new Person(); // a.friend[0] = '王琦'; // a.name = '程嬌'; // var b = new Person(); // b.friend? // b.name? 

一、建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。
二、屬性和方法被加入到 this 引用的對象中。
三、新建立的對象由 this 所引用,而且最後隱式的返回 this 。

17.事件委託?有什麼好處?

(1)利用冒泡的原理,把事件加到父級上,觸發執行效果
(2)好處:新添加的元素還會有以前的事件;提升性能。

18.window.onload ==? DOMContentLoaded ?

通常狀況下,DOMContentLoaded事件要在window.onload以前執行,當DOM樹構建完成的時候就會執行DOMContentLoaded事件,而window.onload是在頁面載入完成的時候,才執行,這其中包括圖片等元素。大多數時候咱們只是想在DOM樹構建完成後,綁定事件到元素,咱們並不須要圖片元素,加上有時候加載外域圖片的速度很是緩慢。

19.節點類型?判斷當前節點類型?

1. 元素節點
2. 屬性節點
3. 文本節點
8. 註釋節點
9. 文檔節點
經過nodeObject.nodeType判斷節點類型:其中,nodeObject 爲DOM節點(節點對象)。該屬性返回以數字表示的節點類型,例如,元素節點返回 1,屬性節點返回 2 。

20.如何合併兩個數組?數組刪除一個元素?

//三種方法。 (1)var arr1=[1,2,3]; var arr2=[4,5,6]; arr1 = arr1.concat(arr2); console.log(arr1); (2)var arr1=[1,2,3]; var arr2=[4,5,6]; Array.prototype.push.apply(arr1,arr2); console.log(arr1); (3)var arr1=[1,2,3]; var arr2=[4,5,6]; for (var i=0; i < arr2.length; i++) { arr1.push( arr2[i] ); } console.log(arr1); 

21.強制轉換 顯式轉換 隱式轉換?

//強制類型轉換: Boolean(0) // => false - 零 Boolean(new object()) // => true - 對象 Number(undefined) // => NaN Number(null) // => 0 String(null) // => "null" parseInt( ) parseFloat( ) JSON.parse( ) JSON.stringify ( ) 

隱式類型轉換:
在使用算術運算符時,運算符兩邊的數據類型能夠是任意的,好比,一個字符串能夠和數字相加。之因此不一樣的數據類型之間能夠作運算,是由於JavaScript引擎在運算以前會悄悄的把他們進行了隱式類型轉換的
(例如:x+"" //等價於String(x)
+x //等價於Number(x)
x-0 //同上
!!x //等價於Boolean(x),是雙歎號)

顯式轉換:
若是程序要求必定要將某一類型的數據轉換爲另外一種類型,則能夠利用強制類型轉換運算符進行轉換,這種強制轉換過程稱爲顯示轉換。
顯示轉換是你定義讓這個值類型轉換成你要用的值類型,是底到高的轉換。例 int 到float就能夠直接轉,int i=5,想把他轉換成char類型,就用顯式轉換(char)i

22. Jq中如何實現多庫並存?

Noconfict 多庫共存就是「$ 」符號的衝突。

方法一: 利用jQuery的實用函數.noConflict();.noConflict();這個函數歸還的名稱控制權給另外一個庫,所以能夠在頁面上使用其餘庫。這時,咱們能夠用"jQuery "這個名稱調用jQuery的功能。 .noConflict(); 
jQuery('#id').hide(); 
..... 
//或者給jQuery一個別名 
var.noConflict(); jQuery('#id').hide(); ..... //或者給jQuery一個別名 varj=jQuery
$j('#id').hide();
.....

方法二: (function($){})(jQuery)

方法三: jQuery(function())jQuery))經過傳遞一個函數做爲jQuery的參數,所以把這個函數聲明爲就緒函數。咱們聲明爲就緒函數的參數,由於jQuery老是吧jQuery對象的引用做爲第一個參數傳遞,因此就保證了函數的執行。

23.Jq中get和eq有什麼區別?

get() :取得其中一個匹配的元素。num表示取得第幾個匹配的元素,get多針對集合元素,返回的是DOM對象組成的數組 eq():獲取第N個元素,下標都是從0開始,返回的是一個JQuery對象

24.如何經過原生js 判斷一個元素當前是顯示仍是隱藏狀態?

if( document.getElementById("div").css("display")==='none') if( document.getElementById("div").css("display")==='block') $("#div").is(":hidden"); // 判斷是否隱藏 $("#div").is(":visible") 

25.Jq如何判斷元素顯示隱藏?

//第一種:使用CSS屬性 var display =$('#id').css('display'); if(display == 'none'){ alert("我是隱藏的!"); } //第二種:使用jquery內置選擇器 <div id="test"> <p>僅僅是測試所用</p> </div> if($("#test").is(":hidden")){ $("#test").show(); //若是元素爲隱藏,則將它顯現 }else{ $("#test").hide(); //若是元素爲顯現,則將其隱藏 } //第三種:jQuery判斷元素是否顯示 是否隱藏 var node=$('#id'); if(node.is(':hidden')){  //若是node是隱藏的則顯示node元素,不然隱藏   node.show();  }else{   node.hide(); } 

26.移動端上什麼是點擊穿透?

點擊穿透現象有3種:
點擊穿透問題:點擊蒙層(mask)上的關閉按鈕,蒙層消失後發現觸發了按鈕下面元素的click事件跨頁面點擊穿透問題:若是按鈕下面剛好是一個有href屬性的a標籤,那麼頁面就會發生跳轉另外一種跨頁面點擊穿透問題:此次沒有mask了,直接點擊頁內按鈕跳轉至新頁,而後發現新頁面中對應位置元素的click事件被觸發了

解決方案:
一、只用touch
最簡單的解決方案,完美解決點擊穿透問題
把頁面內全部click所有換成touch事件( touchstart 、’touchend’、’tap’)

二、只用click
下下策,由於會帶來300ms延遲,頁面內任何一個自定義交互都將增長300毫秒延遲

三、tap後延遲350ms再隱藏mask
改動最小,缺點是隱藏mask變慢了,350ms仍是能感受到慢的

四、pointer-events
比較麻煩且有缺陷, 不建議使用mask隱藏後,給按鈕下面元素添上 pointer-events: none; 樣式,讓click穿過去,350ms後去掉這個樣式,恢復響應缺陷是mask消失後的的350ms內,用戶能夠看到按鈕下面的元素點着沒反應,若是用戶手速很快的話必定會發現

27.Jq綁定事件的幾種方式?on bind ?

jQuery中提供了四種事件監聽方式,分別是bind、live、delegate、on,對應的解除監聽的函數分別是unbind、die、undelegate、off

Bind( )是使用頻率較高的一種,做用就是在選擇到的元素上綁定特定事件類型的監聽函數;

Live( )能夠對後生成的元素也能夠綁定相應的事件,處理機制就是把事件綁定在DOM樹的根節點上,而不是直接綁定在某個元素上;

Delegate( )採用了事件委託的概念,不是直接爲子元素綁定事件,而是爲其父元素(或祖先元素也可)綁定事件,當在div內任意元素上點擊時,事件會一層層從event target向上冒泡,直至到達你爲其綁定事件的元素;

on( )方法能夠綁定動態添加到頁面元素的事件,on()方法綁定事件能夠提高效率;

28.Jq中如何將一個jq對象轉化爲dom對象?

方法一:
jQuery對象是一個數據對象,能夠經過[index]的方法,來獲得相應的DOM對象。
如:var v=v=("#v") ; //jQuery對象
var v=$v[0]; //DOM對象
alert(v.checked) //檢測這個checkbox是否被選中

方法二:
jQuery自己提供,經過.get(index)方法,獲得相應的DOM對象
如:var v=v=("#v"); //jQuery對象
var v=$v.get(0); //DOM對象
alert(v.checked) //檢測這個checkbox是否被選中

29.Jq中有幾種選擇器?分別是什麼?

層疊選擇器、基本過濾選擇器、內容過濾選擇器、可視化過濾選擇器、屬性過濾選擇器、子元素過濾選擇器、表單元素選擇器、表單元素過濾選擇器

30.Jq中怎麼樣編寫插件?

//第一種是類級別的插件開發: //1.1 添加一個新的全局函數 添加一個全局函數,咱們只需以下定義: jQuery.foo = function() { alert('This is a test. This is only a test.'); }; //1.2 增長多個全局函數 添加多個全局函數,可採用以下定義: jQuery.foo = function() { alert('This is a test. This is only a test.'); }; jQuery.bar = function(param) { alert('This function takes a parameter, which is "' + param + '".'); }; 調用時和一個函數的同樣的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar'); //1.3 使用jQuery.extend(object);  jQuery.extend({ foo: function() { alert('This is a test. This is only a test.'); }, bar: function(param) { alert('This function takes a parameter, which is "' + param +'".'); } }); //1.4 使用命名空間 // 雖然在jQuery命名空間中,咱們禁止使用了大量的javaScript函數名和變量名。 // 可是仍然不可避免某些函數或變量名將於其餘jQuery插件衝突,所以咱們習慣將一些方法 // 封裝到另外一個自定義的命名空間。 jQuery.myPlugin = { foo:function() { alert('This is a test. This is only a test.'); }, bar:function(param) { alert('This function takes a parameter, which is "' + param + '".'); } }; //採用命名空間的函數仍然是全局函數,調用時採用的方法: $.myPlugin.foo(); $.myPlugin.bar('baz'); //經過這個技巧(使用獨立的插件名),咱們能夠避免命名空間內函數的衝突。 //第二種是對象級別的插件開發 //形式1: (function($){ $.fn.extend({ pluginName:function(opt,callback){ // Our plugin implementation code goes here. } }) })(jQuery); //形式2: (function($) { $.fn.pluginName = function() { // Our plugin implementation code goes here. }; })(jQuery); //形參是$,函數定義完成以後,把jQuery這個實參傳遞進去.當即調用執行。 //這樣的好處是,咱們在寫jQuery插件時,也可使用$這個別名,而不會與prototype引發衝突 

31.(div+.ab)(′div+.ab′)和('.ab+div') 哪一個效率高?

$('div+.ab')效率高

32..map.map和.each有什麼區別

map()方法主要用來遍歷操做數組和對象,會返回一個新的數組。$.map()方法適用於將數組或對象每一個項目新陣列映射到一個新數組的函數;
each()主要用於遍歷jquery對象,返回的是原來的數組,並不會新建立一個數組。

33.編寫一個 getElementsByClassName 封裝函數?

<body> <input type="submit" id = "sub" class="ss confirm btn" value="提交"/> <script> window.onload = function(){ //方法一 var Opt = document.getElementById('sub'); var getClass = function(className,tagName){ if(document.getElementsByTagName){ var Inp = document.getElementsByTagName(tagName); for(var i=0; i<Inp.length; i++){ if((new RegExp('(\\s|^)' +className +'(\\s|$)')).test(Inp[i].className)){ return Inp[i]; } } }else if(document.getElementsByClassName){ return document.getElementsByClassName(className); } } //方法二 var aa = getClass("confirm", "input"); function getClass(className, targetName){ var ele = []; var all = document.getElementsByTagName(targetName || "*"); for(var i=0; i<all.length; i++){ if(all[i].className.match(new RegExp('(\\s|^)'+confirm+'(\\s|$)'))){ ele[ele.length] = all[i]; } } return ele; } //方法三 function getObjsByClass(tagName, className){ if(document.getElementsByClassName){ alert("document.getElementsByClassName"); return document.getElementsByClassName(className); }else{ var el = []; var _el = document.getElementsByTagName(tagName); for(var i=0; i<_el.length; i++){ if(_el[i].className.indexOf(className) > -1){ alert(_el[i]); el[_el.length] = _el[i]; } } alert(el); return el; } } } </script> </body> 

34.簡述下工做流程

我在以前的公司工做流程大概是這樣的:公司定稿會結束之後,會進行簡單的技術研討,而後咱們前端會進行先期的技術準備。前端切圖人員會進行psd設計稿切圖,而且將css文件進行整合。咱們主要編寫JS部分,其中包括搭建前端框架(大項目),編寫js業務和數據持久化操做,咱們也會編寫js插件而且進行封裝方便使用,還有就是編寫JS前端組建和JS測試單元,最後將完成的JS部分與切圖人員提供的HTML頁面進行整合。最後對完成的頁面進行功能測試、頁面兼容、產品還原。而後對產品進行封存,提交測試。若是出現BUG會返回給咱們開發人員進行修改,再提交測試,最後測試成功,進行版本封存。等到程序所有上線的時候進行線上測試。

35.通常使用什麼版本控制工具?svn如何對文件加鎖

svn加鎖目的:爲了不多我的同一時間對同一個文件改動的相互覆蓋,版本控制系統就必須有一套衝突處理機制。

svn加鎖兩種策略:樂觀加鎖:全部簽出的文件都是可讀寫的,對文件的修改沒必要得到文件的鎖,當你修改完文件簽入時,會首先要求你更新本地文件,版本控制系統不會覆蓋你的本地修改,而是會讓你本身合併衝突後簽入。

嚴格加鎖:全部簽出的文件都是隻讀的,任何對文件的修改必需要得到文件的鎖,若是其餘人沒有擁有該文件的鎖,那麼版本控制系統就會受權給你文件的鎖,並將文件設置爲可編輯的。

svn兩種加鎖步驟:樂觀加鎖:選擇你想要獲取鎖定的文件,而後右鍵菜單點擊TortoiseSVN 選取獲取鎖定。

嚴格加鎖:在想要採起嚴格加鎖的文件或目錄上點擊右鍵,使用TortoiseSVN 屬性菜單,點擊新建屬性,選擇須要鎖定。

36. git 和 svn的區別?

SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此首先要從中央服務器哪裏獲得最新的版本,而後幹活,幹完後,須要把本身作完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工做,若是在局域網還能夠,帶寬夠大,速度夠快,若是在互聯網下,若是網速慢的話,就納悶了。

Git是分佈式版本控制系統,那麼它就沒有中央服務器的,每一個人的電腦就是一個完整的版本庫,這樣,工做的時候就不須要聯網了,由於版本都是在本身的電腦上。既然每一個人的電腦都有一個完整的版本庫,那多我的如何協做呢?好比說本身在電腦上改了文件A,其餘人也在電腦上改了文件A,這時,大家兩之間只需把各自的修改推送給對方,就能夠互相看到對方的修改了。

37. jquery和zepto有什麼區別?

1.針對移動端程序,Zepto有一些基本的觸摸事件能夠用來作觸摸屏交互(tap事件、swipe事件),Zepto是不支持IE瀏覽器的,這不是Zepto的開發者Thomas Fucks在跨瀏覽器問題上犯了迷糊,而是通過了認真考慮後爲了下降文件尺寸而作出的決定,就像jQuery的團隊在2.0版中再也不支持舊版的IE(6 7 8)同樣。由於Zepto使用jQuery句法,因此它在文檔中建議把jQuery做爲IE上的後備庫。那樣程序仍能在IE中,而其餘瀏覽器則能享受到Zepto在文件大小上的優點,然而它們兩個的API不是徹底兼容的,因此使用這種方法時必定要當心,並要作充分的測試。

2.Dom操做的區別:添加id時jQuery不會生效而Zepto會生效。

3.zepto主要用在移動設備上,只支持較新的瀏覽器,好處是代碼量比較小,性能也較好。
jquery主要是兼容性好,能夠跑在各類pc,移動上,好處是兼容各類瀏覽器,缺點是代碼量大,同時考慮兼容,性能也不夠好。

38. (function())window.onload(function())和window.onload和(document).ready(function(){})

window.onload:用於當頁面的全部元素,包括外部引用文件,圖片等都加載完畢時運行函數內的函數。load方法只能執行一次,若是在js文件裏寫了多個,只能執行最後一個。

(document).ready(function())(document).ready(function())和(function(){})都是用於當頁面的標準DOM元素被解析成DOM樹後就執行內部函數。這個函數是能夠在js文件裏屢次編寫的,對於多人共同編寫的js就有很大的優點,由於全部行爲函數都會執行到。並且$(document).ready()函數在HMTL結構加載完後就能夠執行,不須要等大型文件加載或者不存在的鏈接等耗時工做完成才執行,效率高。

39. Jq中 attr 和 prop 有什麼區別

對於HTML元素自己就帶有的固有屬性,在處理時,使用prop方法。
對於HTML元素咱們本身自定義的DOM屬性,在處理時,使用attr方法。

40. 簡述下 this 和定義屬性和方法的時候有什麼區別?Prototype?

this表示當前對象,若是在全局做用範圍內使用this,則指代當前頁面對象window; 若是在函數中使用this,則this指代什麼是根據運行時此函數在什麼對象上被調用。 咱們還可使用apply和call兩個全局方法來改變函數中this的具體指向。

prototype本質上仍是一個JavaScript對象。 而且每一個函數都有一個默認的prototype屬性。

在prototype上定義的屬性方法爲全部實例共享,全部實例皆引用到同一個對象,單一實例對原型上的屬性進行修改,也會影響到全部其餘實例。

41. 什麼是預編譯語音|預編譯處理器?

Sass是一種CSS預處理器語言,經過編程方式生成CSS代碼。由於可編程,因此操控靈活性自由度高,方便實現一些直接編寫CSS代碼較困難的代碼。

同時,由於Sass是生成CSS的語言,因此寫出來的Sass文件是不能直接用的,必須通過編譯器編譯成CSS文件才能使用。

CSS 預處理器是一種語言用來爲 CSS 增長一些編程的的特性,無需考慮瀏覽器的兼容性問題,例如你能夠在 CSS 中使用變量、簡單的程序邏輯、函數等等在編程語言中的一些基本技巧,可讓你的 CSS 更見簡潔,適應性更強,代碼更直觀等諸多好處。最經常使用的css預處理器有sass、less css、 stylus。

42.ajax 和 jsonp ?

ajax和jsonp的區別:
相同點:都是請求一個url
不一樣點:ajax的核心是經過xmlHttpRequest獲取內容
jsonp的核心則是動態添加<script>標籤來調用服務器 提供的js腳本。

43.ajax執行流程?

1. 建立XMLHttpRequest對象,也就是建立一個異步調用對象
2. 建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息
3. 設置響應HTTP請求狀態變化的函數
4. 發送HTTP請求
5. 獲取異步調用返回的數據
6. 使用JavaScript和DOM實現局部刷新

44.xhr對象 status ? readystate?

status是XMLHttpRequest對象的一個屬性,表示響應的HTTP狀態碼。
readyState是XMLHttpRequest對象的一個屬性,用來標識當前XMLHttpRequest對象處於什麼狀態。

45.readystate 0~4

0:未初始化狀態:此時,已經建立了一個XMLHttpRequest對象
1: 準備發送狀態:此時,已經調用了XMLHttpRequest對象的open方法,而且XMLHttpRequest對象已經準備好將一個請求發送到服務器端
2:已經發送狀態:此時,已經經過send方法把一個請求發送到服務器端,可是尚未收到一個響應
3:正在接收狀態:此時,已經接收到HTTP響應頭部信息,可是消息體部分尚未徹底接收到
4:完成響應狀態:此時,已經完成了HTTP響應的接收

46.說出幾個http協議狀態碼?

200, 201, 302, 304, 400, 404, 500

200:請求成功
201:請求成功而且服務器建立了新的資源
302:服務器目前從不一樣位置的網頁響應請求,但請求者應繼續使用原有位置來響應之後的請求。
304:自從上次請求後,請求的網頁未修改過。服務器返回此響應時,不會返回網頁內容。
400:服務器不理解請求的語法。
404:請求的資源(網頁等)不存在
500: 內部服務器錯誤

47.上一個項目是什麼?主要負責哪些?購物車流程?支付功能?

主要負責哪些就講主要作哪些功能模塊:

1)商品模塊:
一、商品列表:商品排序 商品篩選 商品過濾 商品查詢 商品推薦
二、商品詳情:類型推薦 商品簡介 商品詳情 商品評價 售後維護

2)購物車模塊:商品編號、數量、價格、總額、運費、運輸選項、運費總計、從購物車刪除選項、更新數量、結帳、繼續購物、商品描述、庫存信息

48.sessionStorage和localstroage與cookie之間有什麼關聯, cookie最大存放多少字節

三者共同點:都是保存在瀏覽器端,且同源的。

區別:
一、cookie在瀏覽器和服務器間來回傳遞。而sessionStorage和localStorage不會自動把數據發給服務器,僅在本地保存

二、存儲大小限制也不一樣,cookie數據不能超過4k,sessionStorage和localStorage 但比cookie大得多,能夠達到5M

三、數據有效期不一樣,sessionStorage:僅在當前瀏覽器窗口關閉前有效,天然也就不可能持久保持;localStorage:始終有效,窗口或瀏覽器關閉也一直保存,所以用做持久數據;cookie只在設置的cookie過時時間以前一直有效,即便窗口或瀏覽器關閉

四、做用域不一樣,sessionStorage不在不一樣的瀏覽器窗口中共享,即便是同一個頁面(即數據不共享);localStorage 在全部同源窗口中都是共享的;cookie也是在全部同源窗口中都是共享的( 即數據共享 )。

49.ajax中 get 和 post 有什麼區別?

get和post都是數據提交的方式。
get的數據是經過網址問號後邊拼接的字符串進行傳遞的。post是經過一個HTTP包體進行傳遞數據的。
get的傳輸量是有限制的,post是沒有限制的。
get的安全性可能沒有post高,因此咱們通常用get來獲取數據,post通常用來修改數據。

50.Gc機制是什麼?爲何閉包不會被回收變量和函數?

一、Gc垃圾回收機制;
二、外部變量沒釋放,因此指向的大函數內的小函數也釋放不了

51.簡述下你理解的面向對象?

萬物皆對象,把一個對象抽象成類,具體上就是把一個對象的靜態特徵和動態特徵抽象成屬性和方法,也就是把一類事物的算法和數據結構封裝在一個類之中,程序就是多個對象和互相之間的通訊組成的.

面向對象具備封裝性,繼承性,多態性。
封裝:隱蔽了對象內部不須要暴露的細節,使得內部細節的變更跟外界脫離,只依靠接口進行通訊.封裝性下降了編程的複雜性. 經過繼承,使得新建一個類變得容易,一個類從派生類那裏得到其非私有的方法和公用屬性的繁瑣工做交給了編譯器. 而繼承和實現接口和運行時的類型綁定機制 所產生的多態,使得不一樣的類所產生的對象可以對相同的消息做出不一樣的反應,極大地提升了代碼的通用性.

總之,面向對象的特性提升了大型程序的重用性和可維護性.

52.this是什麼 在不一樣場景中分別表明什麼

(1)function a(){ this ?} //This:指向windows

(2)function b(){ return function(){ this ?}}b()(); //This:指向windows

(3)function c(){ return {s:function(){this}}}c().s(); //This:指向object

因爲其運行期綁定的特性,JavaScript 中的 this 含義要豐富得多,它能夠是全局對象、當前對象或者任意對象,這徹底取決於函數的調用方式。

53.你對數據校驗是怎麼樣處理的?jquery.validate?

通俗的說,就是爲保證數據的完整性,用一種指定的算法對原始數據計算出的一個校驗值。接收方用一樣的算法計算一次校驗值,若是和隨數據提供的校驗值同樣,就說明數據是完整的。
用正則表達式來處理;
jquery.validate:爲表單驗證插件

54.如何對登陸的帳號密碼進行加密?

Md5

55.在jq中 mouseover mouseenter mouseout mouseleave 和 hover有什麼關聯?

mouseenter與mouseover:
不論鼠標指針穿過被選中元素或其子元素,都會觸發mouseover事件。
只有在鼠標指針穿過被選元素時,纔會觸發mouseentr事件。

mouseout與mouseleave:
不論鼠標離開被選元素仍是任何子元素,都會觸發mouseout事件。
只有在鼠標指針離開被選元素時,纔會觸發mouseleave事件。

hover:
hover是一個符合方法,至關於mouseenter+mouseleave。

56.jsonp原理? 缺點?

工做原理:使用script標籤實現跨域訪問,可在url中指定回調函數,獲取JSON數據並在指定的回調函數中執行jquery實現jsop。

缺點:只支持GET方式的jsonp實現,是一種腳本注入行爲存在必定的安全隱患。若是返回的數據格式有問題或者返回失敗了,並不會報錯。

57.除了jsonp 還有什麼跨域方式

javascript跨域有兩種狀況:
一、基於同一父域的子域之間,如:http://a.c.comhttp://b.c.com
二、基於不一樣的父域之間,如:http://www.a.comhttp://www.b.com
三、端口的不一樣,如:http://www.a.com:8080http://www.a.com:8088
四、協議不一樣,如:http://www.a.comhttps://www.a.com

對於狀況3和4,須要經過後臺proxy來解決,具體方式以下:
a、在發起方的域下建立proxy程序
b、發起方的js調用本域下的proxy程序
c、proxy將請求發送給接收方並獲取相應數據
d、proxy將得到的數據返回給發起方的js

代碼和ajax調用一致,其實這種方式就是經過ajax進行調用的
而狀況1和2除了經過後臺proxy這種方式外,還能夠有多種辦法來解決:
一、document.domain+iframe(只能解決狀況1):
a、在發起方頁面和接收方頁面設置document.domain,並將值設爲父域的主域名(window.location.hostname)
b、在發起方頁面建立一個隱藏的iframe,iframe的源是接收方頁面
c、根據瀏覽器的不一樣,經過iframe.contentDocument || iframe.contentWindow.document來得到接收方頁面的內容
d、經過得到的接收方頁面的內容來與接收方進行交互
這種方法有個缺點,就是當一個域被攻擊時,另外一個域會有安全漏洞出現。

58.如何使用storage 對js文件進行緩存

因爲sessionStorage - 針對一個 session 的數據存儲,因此咱們通常利用localStorage儲存js文件,只有在第一次訪問該頁面的時候加載js文件,之後在訪問的時候加載本地localStorage執行

59.如何確保ajax或鏈接不走緩存路徑

在Ajax中使用Get請求數據不會有頁面緩存的問題,而使用POST請求但是有時候頁面會緩存咱們提交的信息,致使咱們發送的異步請求不能正確的返回咱們想要的數據

$.post(url,data ,ranNum:Math.random()} ,function(data){})

ranNum : 這個是防止緩存的核心,每次發起請求都會用Math.random()方法生成一個隨機的數字,這樣子就會刷新url緩存

60.split() join()?

前者是切割成數組的形式,
後者是將數組轉換成字符串

61.slice() splice()?

slice() 方法可從已有的數組中返回選定的元素。
splice() 方法向/從數組中添加/刪除項目,而後返回被刪除的項目。

62.typeof?typeof [ ]返回數據類型是?

//判斷基本數據類型;var a=[];typeof a輸出object; //原本判斷一個對象類型用typeof是最好的,不過對於Array類型是不適用的, //可使用 instanceof操做符: var arrayStr=new Array("1","2","3","4","5"); alert(arrayStr instanceof Array); //固然以上在一個簡單的頁面佈局裏面是沒有問題的,若是是複雜頁面狀況, //入獲取的是frame內部的Array對象,能夠用這個函數判斷: function isArray(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } 

63.disabled readyonly?

readonly只針對input(text / password)和textarea有效,而disabled對於全部的表單元素都有效,當表單元素在使用了disabled後,當咱們將表單以POST或GET的方式提交的話,這個元素的值不會被傳遞出去,而readonly會將該值傳遞出去。

64.同步異步?

一、進程同步:就是在發出一個功能調用時,在沒有獲得結果以前,該調用就不返回。也就是必須一件一件事作,等前一件作完了才能作下一件事

二、異步的概念和同步相對。當一個異步過程調用發出後,調用者不能馬上獲得結果。實際處理這個調用的部件在完成後,經過狀態、通知和回調來通知調用者。

65.promise

Promise的構造函數接收一個參數,是函數,而且傳入兩個參數:resolve,reject,分別表示異步操做執行成功後的回調函數和異步操做執行失敗後的回調函數。

66.函數fn1 函數fn2 函數fn3,若是想在三個函數都執行完成後執行某一個事件應該如何實現?

//一、設置事件監聽。 //二、回調函數: function fn1(){ console.log("執行fn1"); fn2(); } function fn2(){ console.log("執行fn2"); fn3(); } function fn3(){ console.log("執行fn3"); mou(); } function mou(){ console.log("執行某個函數"); } fn1(); 

67.JavaScript提供了哪幾種「異步模式」?

一、回調函數(callbacks)
二、事件監聽
三、Promise對象

68.什麼是移動端的300ms延遲?什麼是點擊穿透?解決方案?

移動端300ms延遲:假定這麼一個場景。用戶在 瀏覽器裏邊點擊了一個連接。因爲用戶能夠進行雙擊縮放或者雙擊滾動的操做,當用戶一次點擊屏幕以後,瀏覽器並不能馬上判斷用戶是確實要打開這個連接,仍是想要進行雙擊操做。所以,瀏覽器 就等待 300 毫秒,以判斷用戶是否再次點擊了屏幕。也就是說,當咱們點擊頁面的時候移動端瀏覽器並非當即做出反應,而是會等上一小會兒纔會出現點擊的效果。

點擊穿透:假如頁面上有兩個元素A和B。B元素在A元素之上。咱們在B元素的touchstart事件上註冊了一個回調函數,該回調函數的做用是隱藏B元素。咱們發現,當咱們點擊B元素,B元素被隱藏了,隨後,A元素觸發了click事件。這是由於在移動端瀏覽器,事件執行的順序是touchstart > touchend > click。而click事件有300ms的延遲,當touchstart事件把B元素隱藏以後,隔了300ms,瀏覽器觸發了click事件,可是此時B元素不見了,因此該事件被派發到了A元素身上。若是A元素是一個連接,那此時頁面就會意外地跳轉。

300ms延遲解決方案:
(1) 禁用縮放,在html文檔頭部加meta標籤以下:
<meta name=」viewport」 content=」user-scalable=no」/>

(2) 更改默認的視口寬度 (響應式佈局,消除了站點上可能存在的雙擊綻開的請求)
<meta name=」viewport」 content=」width=device-width」/>

(3) Css touch-action
touch-action:none;在該元素上的操做不會觸發用戶代理的任何行爲,無需進行3000ms延遲判斷。

(4) FastClick爲解決移動端瀏覽器300毫秒延遲開發的一個輕量級的庫
點擊穿透解決方案:
(1)只用touch
(2)只用click
(3)tap後延遲350ms再隱藏mask
(4)pointer-events

69.變量做用域?

//變量做用域:一個變量的做用域是程序源代碼中定義這個變量的區域。全局變量擁有全局做用域, //在js代碼中任何地方都是有定義的。在函數內聲明的變量只在函數體內有定義,它們是局部變量, //做用域是局部性的。函數參數也是局部變量,它們只在函數體內有定義。 var a = ""; window.b=''」; function(e) { var c= ""; d=""; e=""; } function go() { console.info(this);//window return function() { console.info(this); // window return { b:function(){ console.info(this); //b的父對象 } } } } go()().b(); 

70.call & apply 二者之間的區別

call和apply都是改變this指向的方法,區別在於call能夠寫多個參數,而apply只能寫兩個參數,第二個參數是一個數組,用於存放要傳的參數。

71.call和apply 有什麼好處?

用call和apply:實現更好的繼承和擴展,更安全。

72.誰是c的構造函數?

function ab() { this.say = ""; } ab.constructor = {} ab.name = ''; var c = new ab(); //構造函數默認指向函數自己,ab是一個類,它的構造函數是它自己, //而後ab.constructor={};ab的構造函數就指向{}了,c是ab的實例化對象,c的構造函數就是{} //經過使用new的時候,建立對象發生了那些改變? 當使用new操做時,會立刻開闢一個塊內存, //建立一個空對象,並將this指向這個對象。接着,執行構造函數ab(),對這個空對象進行構造 //(構造函數裏有什麼屬性和方法都一一給這個空白對象裝配上去,這就是爲什麼它叫構造函數了)。 

73.sass和less有什麼區別?

1.編譯環境不同 Sass的安裝須要Ruby環境,是在服務端處理的,而Less是須要引入less.js來處理Less代碼輸出css到瀏覽器,也能夠在開發環節使用Less,而後編譯成css文件,直接放到項目中。

2.變量符不一相,less是@,而scss是$,並且它們的做用域也不同,less是塊級做用域

3.輸出設置,Less沒有輸出設置,sass提供4種輸出選項,nested,compact,compressed和expanded nested:嵌套縮進的css代碼(默認) expanded:展開的多行css代碼 compact:簡潔格式的css代碼 compressed:壓縮後的css代碼

4.sass支持條件語句,可使用if{}else{},for{}循環等等,而less不行

5.引用外部css文件,sass引用外部文件必須以開頭,文件名若是如下劃線形狀,sass會認爲該文件是一個引用文件,不會將其編譯爲css文件。less引用外部文件和css中的@import沒什麼差別。

6.sass和less的工具庫不一樣。sass有工具庫Compass, 簡單說,sass和Compass的關係有點像Javascript和jQuery的關係,Compass是sass的工具庫。在它的基礎上,封裝了一系列有用的模塊和模板,補充強化了sass的功能。less有UI組件庫Bootstrap,Bootstrap是web前端開發中一個比較有名的前端UI組件庫,Bootstrap的樣式文件部分源碼就是採用less語法編寫。

總結:無論是sass,仍是less,均可以視爲一種基於CSS之上的高級語言,其目的是使得CSS開發更靈活和更強大,sass的功能比less強大,基本能夠說是一種真正的編程語言了,less則相對清晰明瞭,易於上手,對編譯環境要求比較寬鬆。考慮到編譯sass要安裝Ruby,而Ruby官網在國內訪問不了,我的在實際開發中更傾向於選擇less。

74.bootstrap好處?

自適應和響應式佈局,12柵格系統,統一的界面風格和css樣式有利於團隊開發。編寫靈活、穩定、高質量的 HTML 和 CSS 代碼的規範。

75.開發時如何對項目進行管理?gulp?

本人開發時,利用gulp等前端工做流管理工具管理項目。 gulp是新一代的前端項目構建工具,你可使用gulp及其插件對你的項目代碼(less,sass)進行編譯,還能夠壓縮你的js和css代碼,甚至壓縮你的圖片,可以合併文件,壓縮文件,語法檢查,監聽文件變化,測試,轉換二進制,轉換圖片等一系列功能。gulp僅有少許的API,因此很是容易學習。實現良好的項目管理。

76.壓縮合並目的?http請求的優化方式?

1)Web性能優化最佳實踐中最重要的一條是減小HTTP請求。而減小HTTP請求的最主要的方式就是,合併並壓縮JavaScript和CSS文件。

CSS Sprites(CSS精靈):把全站的圖標都放在一個圖像文件中,而後用CSS的background-image和background-position屬性定位來顯示其中的一小部分。

合併腳本和樣式表; 圖片地圖:利用image map標籤訂義一個客戶端圖像映射,(圖像映射指帶有可點擊區域的一幅圖像)具體看:http://club.topsage.com/thread-2527479-1-1.html

圖片js/css等靜態資源放在靜態服務器或CDN服時,儘可能採用不用的域名,這樣能防止cookie不會互相污染,減小每次請求的往返數據。

css替代圖片, 緩存一些數據

少用location.reload():使用location.reload() 會刷新頁面,刷新頁面時頁面全部資源 (css,js,img等) 會從新請求服務器。建議使用location.href="當前頁url" 代替location.reload() ,使用location.href 瀏覽器會讀取本地緩存資源。

77.ajax請求方式有幾種(8種)?

1).get(url,[data],[callback])2.get(url,[data],[callback])2).getJSON(url,[data],[callback])
3).post(url,[data],[callback],[type])4.post(url,[data],[callback],[type])4).ajax(opiton)
5)$.getScript( url, [callback] )
6)jquery對象.load( url, [data], [callback] )
7)serialize() 與 serializeArray()

78.如何copy一個dom元素?

原生Js方法:var div = document.getElementsByTagName('div')[0];
var clone = div.cloneNode();
Jquery方法:$('div').clone();
在默認狀況下,.clone()方法不會複製匹配的元素或其後代元素中綁定的事件。不過,能夠爲這個方法傳遞一個布爾值參數,將這個參數設置爲true, 就能夠連同事件一塊兒複製,即.clone(true)。

79.數組的排序方法(sort)?排序?漢字排序?

數組的排序方法:reverse()和sort()。reverse()方法會對反轉數組項的順序。
Eg:var values = [0, 1, 5, 10, 15]; values.sort();//0,1,10,15,5
var values = [1, 2, 3, 4, 5]; values.reverse();//5,4,3,2,1

js中的排序(詳情參考:http://www.tuicool.com/articles/IjInMbU
利用sort排序, 冒泡排序, 快速排序, 插入排序, 希爾排序, 選擇排序
歸併排序

localeCompare() 方法用於字符串編碼的排序
localeCompare 方法:返回一個值,指出在當前的區域設置中兩個字符串是否相同。

80.簡述一下你理解的面向對象?

面向對象是基於萬物皆對象這個哲學觀點. 把一個對象抽象成類,具體上就是把一個對象的靜態特徵和動態特徵抽象成屬性和方法,也就是把一類事物的算法和數據結構封裝在一個類之中,程序就是多個對象和互相之間的通訊組成的.

面向對象具備封裝性,繼承性,多態性。

封裝:隱蔽了對象內部不須要暴露的細節,使得內部細節的變更跟外界脫離,只依靠接口進行通訊.封裝性下降了編程的複雜性. 經過繼承,使得新建一個類變得容易,一個類從派生類那裏得到其非私有的方法和公用屬性的繁瑣工做交給了編譯器. 而 繼承和實現接口和運行時的類型綁定機制 所產生的多態,使得不一樣的類所產生的對象可以對相同的消息做出不一樣的反應,極大地提升了代碼的通用性.

總之,面向對象的特性提升了大型程序的重用性和可維護性.

81.如何建立一個對象?

1. 工廠模式
2. 構造函數模式
3. 原型模式
4. 混合構造函數和原型模式
5. 動態原型模式
6. 寄生構造函數模式
7. 穩妥構造函數模式

程序的設計模式?工廠模式?發佈訂閱?
1)設計模式並非某種語言的某塊代碼,設計模式是一種思想,提供給在編碼時候遇到的各類問題是能夠採起的解決方案,更傾向於一種邏輯思惟,而不是萬能代碼塊。
設計模式主要分三個類型:建立型、結構型和行爲型。
建立型模式:單例模式,抽象工廠模式,建造者模式,工廠模式與原型模式。
結構型模式:適配器模式,橋接模式,裝飾者模式,組合模式,外觀模式,享元模式以及代理模式。
行爲型模式:模板方法模式,命令模式,迭代器模式,觀察者模式,中介者模式,備忘錄模式,解釋器模式,狀態模式,策略模式,職責鏈模式和訪問者模式。

2)與建立型模式相似,工廠模式建立對象(視爲工廠裏的產品)是無需指定建立對象的具體類。
工廠模式定義一個用於建立對象的接口,這個接口由子類決定實例化哪個類。該模式使一個類的實例化延遲到了子類。而子類能夠重寫接口方法以便建立的時候指定本身的對象類型。

3)觀察者模式又叫作發佈訂閱模式,它定義了一種一對多的關係,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象的狀態發生改變時就會通知全部觀察着對象。它是由兩類對象組成,主題和觀察者,主題負責發佈事件,同時觀察者經過訂閱這些事件來觀察該主體,發佈者和訂閱者是徹底解耦的,彼此不知道對方的存在,二者僅僅共享一個自定義事件的名稱。
( 設計模式實在是過高深了,小夥伴門結合網上實例自行學習,我實在是無能爲力啊 )

82.commonjs?requirejs?AMD|CMD|UMD?

1.CommonJS就是爲JS的表現來制定規範,NodeJS是這種規範的實現,webpack 也是以CommonJS的形式來書寫。由於js沒有模塊的功能,因此CommonJS應運而生。但它不能在瀏覽器中運行。 CommonJS定義的模塊分爲:{模塊引用(require)} {模塊定義(exports)} {模塊標識(module)}

2.RequireJS 是一個JavaScript模塊加載器。 RequireJS有兩個主要方法(method): define()和require()。這兩個方法基本上擁有相同的定義(declaration) 而且它們都知道如何加載的依賴關係,而後執行一個回調函數(callback function)。與require()不一樣的是, define()用來存儲代碼做爲一個已命名的模塊。 所以define()的回調函數須要有一個返回值做爲這個模塊定義。這些相似被定義的模塊叫做AMD (Asynchronous Module Definition,異步模塊定義)。

3.AMD 是 RequireJS 在推廣過程當中對模塊定義的規範化產出 AMD異步加載模塊。它的模塊支持對象 函數 構造器 字符串 JSON等各類類型的模塊。 適用AMD規範適用define方法定義模塊。

4.CMD是SeaJS 在推廣過程當中對模塊定義的規範化產出
AMD與CDM的區別:
(1)對於於依賴的模塊,AMD 是提早執行(好像如今也能夠延遲執行了),CMD 是延遲執行。
(2)AMD 推崇依賴前置,CMD 推崇依賴就近。
(3)AMD 推崇複用接口,CMD 推崇單用接口。
(4)書寫規範的差別。

5.umd是AMD和CommonJS的糅合。
AMD 瀏覽器第一的原則發展 異步加載模塊。
CommonJS模塊以服務器第一原則發展,選擇同步加載,它的模塊無需包裝(unwrapped modules)。這迫令人們又想出另外一個更通用的模式UMD ( Universal Module Definition ), 但願解決跨平臺的解決方案。UMD先判斷是否支持Node.js的模塊( exports )是否存在,存在則使用Node.js模塊模式。

83. js的幾種繼承方式?

1.使用對象冒充實現繼承
2.採用call、Apply方法改變函數上下文實現繼承
3.原型鏈方式繼承

84. JavaScript原型,原型鏈 ? 有什麼特色?

在JavaScript中,一共有兩種類型的值,原始值和對象值.每一個對象都有一個內部屬性[[prototype]],咱們一般稱之爲原型.原型的值能夠是一個對象,也能夠是null.若是它的值是一個對象,則這個對象也必定有本身的原型.這樣就造成了一條線性的鏈,咱們稱之爲原型鏈.

訪問一個對象的原型可使用ES5中的Object.getPrototypeOf方法,或者ES6中的proto屬性. 原型鏈的做用是用來實現繼承,好比咱們新建一個數組,數組的方法就是從數組的原型上繼承而來的。

85. eval是作什麼的?

它的功能是把對應的字符串解析成JS代碼並運行; 應該避免使用eval,不安全,很是耗性能(2次,一次解析成js語句,一次執行)。

86. null,undefined 的區別?

undefined表示變量聲明但未初始化的值,null表示準備用來保存對象,尚未真正保存對象的值。從邏輯角度看,null表示一個空對象指針。

87. JSON 的瞭解?

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小。

88. js延遲加載的方式有哪些?

defer和async、動態建立DOM方式(用得最多)、按需異步載入js

89. ajax 是什麼?

異步javascript和XML,是指一種建立交互式網頁應用的網頁開發技術。經過後臺與服務器進行少許數據交換,AJAX可使網頁實現異步更新。這意味着能夠在不從新加載整個網頁的狀況下,對網頁的某部分進行更新。

90. 同步和異步的區別?

javascript同步表示sync,指:代碼依次執行 javascript異步表示async,指:代碼執行不按順序,‘跳過’執行,待其餘某些代碼執行完後再來執行,成爲異步。

91. 如何解決跨域問題?

Jsonp、iframe、window.name、window.postMessage、服務器上設置代理頁面

92. 異步加載的方式有哪些?

(1) defer,只支持IE
(2) async:true
(3) 建立script,插入到DOM中,加載完畢後callBack

93. jQuery與jQuery UI 有啥區別?

jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。
jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。提供了一些經常使用的界面元素,諸如對話框、拖動行爲、改變大小行爲等等。

94. 你有哪些性能優化的方法?

(1) 減小http請求次數:CSS Sprites, JS、CSS源碼壓縮、圖片大小控制合適;網頁Gzip, CDN託管,data緩存 ,圖片服務器。

(2) 前端模板 JS+數據,減小因爲HTML標籤致使的帶寬浪費,前端用變量保存AJAX請求結果,每次操做本地變量,不用請求,減小請求次數

(3) 用innerHTML代替DOM操做,減小DOM操做次數,優化javascript性能。

(4) 當須要設置的樣式不少時設置className而不是直接操做style。

(5) 少用全局變量、緩存DOM節點查找的結果。減小IO讀取操做。

(6) 避免使用CSS Expression(css表達式)又稱Dynamic properties(動態屬性)。

(7) 圖片預加載,將樣式表放在頂部,將腳本放在底部 加上時間戳。

(8) 避免在頁面的主體佈局中使用table,table要等其中的內容徹底下載以後纔會顯示出來,顯示比div+css佈局慢。

95. 一個頁面從輸入 URL 到頁面加載顯示完成,這個過程當中都發生了什麼?(流程說的越詳細越好)

查找瀏覽器緩存
DNS解析、查找該域名對應的IP地址、重定向(301)、發出第二個GET請求
進行HTTP協議會話
客戶端發送報頭(請求報頭)
服務器回饋報頭(響應報頭)
html文檔開始下載
文檔樹創建,根據標記請求所需指定MIME類型的文件
文件顯示

瀏覽器這邊作的工做大體分爲如下幾步:
加載:根據請求的URL進行域名解析,向服務器發起請求,接收文件(HTML、JS、CSS、圖象等)。
解析:對加載到的資源(HTML、JS、CSS等)進行語法解析,建議相應的內部數據結構(好比HTML的DOM樹,JS的(對象)屬性表,CSS的樣式規則等等)

96. ajax的缺點

一、ajax不支持瀏覽器back按鈕。二、安全問題 AJAX暴露了與服務器交互的細節。三、對搜索引擎的支持比較弱。四、破壞了程序的異常機制。五、不容易調試

相關文章
相關標籤/搜索