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

1.幾種基本數(shù)據(jù)類型?復(fù)雜數(shù)據(jù)類型?值類型和引用數(shù)據(jù)類型?堆棧數(shù)據(jù)結(jié)構(gòu)?

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

2.聲明函數(shù)作用提升?聲明變量和聲明函數(shù)的提升有什么區(qū)別?

(1) 變量聲明提升:變量申明在進入執(zhí)行上下文就完成了。
只要變量在代碼中進行了聲明,無論它在哪個位置上進行聲明, js引擎都會將它的聲明放在范圍作用域的頂部;

(2) 函數(shù)聲明提升:執(zhí)行代碼之前會先讀取函數(shù)聲明,意味著可以把函數(shù)申明放在調(diào)用它的語句后面。
只要函數(shù)在代碼中進行了聲明,無論它在哪個位置上進行聲明, js引擎都會將它的聲明放在范圍作用域的頂部;

(3) 變量or函數(shù)聲明:函數(shù)聲明會覆蓋變量聲明,但不會覆蓋變量賦值。
同一個名稱標(biāo)識a,即有變量聲明var a,又有函數(shù)聲明function a() {},不管二者聲明的順序,函數(shù)聲明會覆蓋變量聲明,也就是說,此時a的值是聲明的函數(shù)function a() {}。注意:如果在變量聲明的同時初始化a,或是之后對a進行賦值,此時a的值變量的值。eg: var a; var c = 1; a = 1; function a() { return true; } console.log(a);

3.判斷數(shù)據(jù)類型?

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

4.異步編程?

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

方法2:時間監(jiān)聽,可以綁定多個事件,每個事件可以指定多個回調(diào)函數(shù),而且可以“去耦合”(Decoupling),有利于實現(xiàn)模塊化。缺點是整個程序都要變成事件驅(qū)動型,運行流程會變得很不清晰。

方法3:發(fā)布/訂閱,性質(zhì)與“事件監(jiān)聽”類似,但是明顯優(yōu)于后者。

方法4:Promises對象,是CommonJS工作組提出的一種規(guī)范,目的是為異步編程提供統(tǒng)一接口。
簡單說,它的思想是,每一個異步任務(wù)返回一個Promise對象,該對象有一個then方法,允許指定回調(diào)函數(shù)。

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

事件流:從頁面中接收事件的順序。也就是說當(dāng)一個事件產(chǎn)生時,這個事件的傳播過程,就是事件流。

IE中的事件流叫事件冒泡;事件冒泡:事件開始時由最具體的元素接收,然后逐級向上傳播到較為不具體的節(jié)點(文檔)。對于html來說,就是當(dāng)一個元素產(chǎn)生了一個事件,它會把這個事件傳遞給它的父元素,父元素接收到了之后,還要繼續(xù)傳遞給它的上一級元素,就這樣一直傳播到document對象(親測現(xiàn)在的瀏覽器到window對象,只有IE8及下不這樣

事件捕獲是不太具體的元素應(yīng)該更早接受到事件,而最具體的節(jié)點應(yīng)該最后接收到事件。他們的用意是在事件到達目標(biāo)之前就捕獲它;也就是跟冒泡的過程正好相反,以html的click事件為例,document對象(DOM級規(guī)范要求從document開始傳播,但是現(xiàn)在的瀏覽器是從window對象開始的)最先接收到click事件的然后事件沿著DOM樹依次向下傳播,一直傳播到事件的實際目標(biāo);

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

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

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

body.appendChild(dom元素);
innerHTML:從對象的起始位置到終止位置的全部內(nèi)容,包括Html標(biāo)簽。
innerText:從起始位置到終止位置的內(nèi)容, 但它去除Html標(biāo)簽
分別簡述五個window對象、屬性

成員對象
window.event window.document window.history
window.screen window.navigator window.external
Window對象的屬性如下:
window //窗戶自身
window.self //引用本窗戶window=window.self
window.name //為窗戶命名
window.defaultStatus //設(shè)定窗戶狀態(tài)欄信息
window.location //URL地址,配備布置這個屬性可以打開新的頁面

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

1)客戶端產(chǎn)生js的事件
2)創(chuàng)建XMLHttpRequest對象
3)對XMLHttpRequest進行配置
4)通過AJAX引擎發(fā)送異步請求
5)服務(wù)器端接收請求并且處理請求,返回html或者xml內(nèi)容
6)XML調(diào)用一個callback()處理響應(yīng)回來的內(nèi)容
7)頁面局部刷新

9.回調(diào)函數(shù)?

回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應(yīng)。

10.什么是閉包? 堆棧溢出有什么區(qū)別? 內(nèi)存泄漏? 那些操作會造成內(nèi)存泄漏?怎么樣防止內(nèi)存泄漏?*

閉包:就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。
堆棧溢出:就是不顧堆棧中分配的局部數(shù)據(jù)塊大小,向該數(shù)據(jù)塊寫入了過多的數(shù)據(jù),導(dǎo)致數(shù)據(jù)越界,結(jié)果覆蓋了別的數(shù)據(jù)。經(jīng)常會在遞歸中發(fā)生。
內(nèi)存泄露是指:用動態(tài)存儲分配函數(shù)內(nèi)存空間,在使用完畢后未釋放,導(dǎo)致一直占據(jù)該內(nèi)存單元。直到程序結(jié)束。指任何對象在您不再擁有或需要它之后仍然存在。

造成內(nèi)存泄漏:
setTimeout 的第一個參數(shù)使用字符串而非函數(shù)的話,會引發(fā)內(nèi)存泄漏。
閉包、控制臺日志、循環(huán)(在兩個對象彼此引用且彼此保留時,就會產(chǎn)生一個循環(huán))
防止內(nèi)存泄露:
1、不要動態(tài)綁定事件;
2、不要在動態(tài)添加,或者會被動態(tài)移除的dom上綁事件,用事件冒泡在父容器監(jiān)聽事件;
3、如果要違反上面的原則,必須提供destroy方法,保證移除dom后事件也被移除,這點可以參考Backbone的源代碼,做的比較好;
4、單例化,少創(chuàng)建dom,少綁事件。

11.平時工作中怎么樣進行數(shù)據(jù)交互?如果后臺沒有提供數(shù)據(jù)怎么樣進行開發(fā)?mock數(shù)據(jù)與后臺返回的格式不同意怎么辦?

由后臺編寫接口文檔、提供數(shù)據(jù)接口實、前臺通過ajax訪問實現(xiàn)數(shù)據(jù)交互;
在沒有數(shù)據(jù)的情況下尋找后臺提供靜態(tài)數(shù)據(jù)或者自己定義mock數(shù)據(jù);
返回數(shù)據(jù)不統(tǒng)一時編寫映射文件 對數(shù)據(jù)進行映射。

12 簡述ajax執(zhí)行流程

基本步驟:
var xhr =null;//創(chuàng)建對象 
if(window.XMLHttpRequest){
       xhr = new XMLHttpRequest();
}else{
       xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open(“方式”,”地址”,”標(biāo)志位”);//初始化請求 
   xhr.setRequestHeader(“”,””);//設(shè)置http頭信息 
xhr.onreadystatechange =function(){}//指定回調(diào)函數(shù) 
xhr.send();//發(fā)送請求 

13.自執(zhí)行函數(shù)?用于什么場景?好處?

自執(zhí)行函數(shù):1、聲明一個匿名函數(shù)2、馬上調(diào)用這個匿名函數(shù)。
作用:創(chuàng)建一個獨立的作用域。

好處:防止變量彌散到全局,以免各種js庫沖突。隔離作用域避免污染,或者截斷作用域鏈,避免閉包造成引用變量無法釋放。利用立即執(zhí)行特性,返回需要的業(yè)務(wù)函數(shù)或?qū)ο螅苊饷看瓮ㄟ^條件判斷來處理

場景:一般用于框架、插件等場景

14.html和xhtml有什么區(qū)別?

HTML是一種基本的WEB網(wǎng)頁設(shè)計語言,XHTML是一個基于XML的標(biāo)記語言。
1.XHTML 元素必須被正確地嵌套。
2.XHTML 元素必須被關(guān)閉。
3.標(biāo)簽名必須用小寫字母。
4.空標(biāo)簽也必須被關(guān)閉。
5.XHTML 文檔必須擁有根元素。

15. 什么是構(gòu)造函數(shù)?與普通函數(shù)有什么區(qū)別?

構(gòu)造函數(shù):是一種特殊的方法、主要用來創(chuàng)建對象時初始化對象,總與new運算符一起使用,創(chuàng)建對象的語句中構(gòu)造函數(shù)的函數(shù)名必須與類名完全相同。
與普通函數(shù)相比只能由new關(guān)鍵字調(diào)用,構(gòu)造函數(shù)是類的標(biāo)示

16. 通過new創(chuàng)建一個對象的時候,函數(shù)內(nèi)部有哪些改變

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?

1、創(chuàng)建一個空對象,并且 this 變量引用該對象,同時還繼承了該函數(shù)的原型。
2、屬性和方法被加入到 this 引用的對象中。
3、新創(chuàng)建的對象由 this 所引用,并且最后隱式的返回 this 。

17.事件委托?有什么好處?

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

18.window.onload ==? DOMContentLoaded ?

一般情況下,DOMContentLoaded事件要在window.onload之前執(zhí)行,當(dāng)DOM樹構(gòu)建完成的時候就會執(zhí)行DOMContentLoaded事件,而window.onload是在頁面載入完成的時候,才執(zhí)行,這其中包括圖片等元素。大多數(shù)時候我們只是想在DOM樹構(gòu)建完成后,綁定事件到元素,我們并不需要圖片元素,加上有時候加載外域圖片的速度非常緩慢。

19.節(jié)點類型?判斷當(dāng)前節(jié)點類型?

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

20.如何合并兩個數(shù)組?數(shù)組刪除一個元素?

//三種方法。
 (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.強制轉(zhuǎn)換 顯式轉(zhuǎn)換 隱式轉(zhuǎn)換?

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

隱式類型轉(zhuǎn)換:
在使用算術(shù)運算符時,運算符兩邊的數(shù)據(jù)類型可以是任意的,比如,一個字符串可以和數(shù)字相加。之所以不同的數(shù)據(jù)類型之間可以做運算,是因為JavaScript引擎在運算之前會悄悄的把他們進行了隱式類型轉(zhuǎn)換的
(例如:x+"" //等價于String(x)
+x //等價于Number(x)
x-0 //同上
!!x //等價于Boolean(x),是雙嘆號)

顯式轉(zhuǎn)換:
如果程序要求一定要將某一類型的數(shù)據(jù)轉(zhuǎn)換為另一種類型,則可以利用強制類型轉(zhuǎn)換運算符進行轉(zhuǎn)換,這種強制轉(zhuǎn)換過程稱為顯示轉(zhuǎn)換。
顯示轉(zhuǎn)換是你定義讓這個值類型轉(zhuǎn)換成你要用的值類型,是底到高的轉(zhuǎn)換。例 int 到float就可以直接轉(zhuǎn),int i=5,想把他轉(zhuǎn)換成char類型,就用顯式轉(zhuǎn)換(char)i

22. Jq中如何實現(xiàn)多庫并存?

Noconfict 多庫共存就是“$ ”符號的沖突。

方法一: 利用jQuery的實用函數(shù)$.noConflict();這個函數(shù)歸還$的名稱控制權(quán)給另一個庫,因此可以在頁面上使用其他庫。這時,我們可以用"jQuery "這個名稱調(diào)用jQuery的功能。 $.noConflict();
jQuery('#id').hide();
.....
//或者給jQuery一個別名
var $j=jQuery
$j('#id').hide();
.....

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

方法三: jQuery(function($){})
通過傳遞一個函數(shù)作為jQuery的參數(shù),因此把這個函數(shù)聲明為就緒函數(shù)。 我們聲明$為就緒函數(shù)的參數(shù),因為jQuery總是吧jQuery對象的引用作為第一個參數(shù)傳遞,所以就保證了函數(shù)的執(zhí)行。

23.Jq中g(shù)et和eq有什么區(qū)別?

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

24.如何通過原生js 判斷一個元素當(dāng)前是顯示還是隱藏狀態(tài)?

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內(nèi)置選擇器 
<div id="test"> <p>僅僅是測試所用</p> </div>
if($("#test").is(":hidden")){        $("#test").show();    //如果元素為隱藏,則將它顯現(xiàn) }else{       $("#test").hide();     //如果元素為顯現(xiàn),則將其隱藏 }
//第三種:jQuery判斷元素是否顯示 是否隱藏
var node=$('#id');
if(node.is(':hidden')){  //如果node是隱藏的則顯示node元素,否則隱藏
  node.show(); 
}else{
  node.hide();
}

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

點擊穿透現(xiàn)象有3種:
點擊穿透問題:點擊蒙層(mask)上的關(guān)閉按鈕,蒙層消失后發(fā)現(xiàn)觸發(fā)了按鈕下面元素的click事件跨頁面點擊穿透問題:如果按鈕下面恰好是一個有href屬性的a標(biāo)簽,那么頁面就會發(fā)生跳轉(zhuǎn)另一種跨頁面點擊穿透問題:這次沒有mask了,直接點擊頁內(nèi)按鈕跳轉(zhuǎn)至新頁,然后發(fā)現(xiàn)新頁面中對應(yīng)位置元素的click事件被觸發(fā)了

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

2、只用click
下下策,因為會帶來300ms延遲,頁面內(nèi)任何一個自定義交互都將增加300毫秒延遲

3、tap后延遲350ms再隱藏mask
改動最小,缺點是隱藏mask變慢了,350ms還是能感覺到慢的

4、pointer-events
比較麻煩且有缺陷, 不建議使用mask隱藏后,給按鈕下面元素添上 pointer-events: none; 樣式,讓click穿過去,350ms后去掉這個樣式,恢復(fù)響應(yīng)缺陷是mask消失后的的350ms內(nèi),用戶可以看到按鈕下面的元素點著沒反應(yīng),如果用戶手速很快的話一定會發(fā)現(xiàn)

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

jQuery中提供了四種事件監(jiān)聽方式,分別是bind、live、delegate、on,對應(yīng)的解除監(jiān)聽的函數(shù)分別是unbind、die、undelegate、off

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

Live( )可以對后生成的元素也可以綁定相應(yīng)的事件,處理機制就是把事件綁定在DOM樹的根節(jié)點上,而不是直接綁定在某個元素上;

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

on( )方法可以綁定動態(tài)添加到頁面元素的事件,on()方法綁定事件可以提升效率;

28.Jq中如何將一個jq對象轉(zhuǎn)化為dom對象?

方法一:
jQuery對象是一個數(shù)據(jù)對象,可以通過[index]的方法,來得到相應(yīng)的DOM對象。
如:var $v =$("#v") ; //jQuery對象
var v=$v[0]; //DOM對象
alert(v.checked) //檢測這個checkbox是否被選中

方法二:
jQuery本身提供,通過.get(index)方法,得到相應(yīng)的DOM對象
如:var $v=$("#v"); //jQuery對象
var v=$v.get(0); //DOM對象
alert(v.checked) //檢測這個checkbox是否被選中

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

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

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

//第一種是類級別的插件開發(fā):
//1.1 添加一個新的全局函數(shù) 添加一個全局函數(shù),我們只需如下定義: 
jQuery.foo = function() {
     alert('This is a test. This is only a test.');  };   

//1.2 增加多個全局函數(shù) 添加多個全局函數(shù),可采用如下定義: 
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 + '".');  };   調(diào)用時和一個函數(shù)的一樣的: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函數(shù)名和變量名。
// 但是仍然不可避免某些函數(shù)或變量名將于其他jQuery插件沖突,因此我們習(xí)慣將一些方法
// 封裝到另一個自定義的命名空間。
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 + '".');   
 }        
}; 
//采用命名空間的函數(shù)仍然是全局函數(shù),調(diào)用時采用的方法: 
$.myPlugin.foo();        
$.myPlugin.bar('baz');
//通過這個技巧(使用獨立的插件名),我們可以避免命名空間內(nèi)函數(shù)的沖突。

//第二種是對象級別的插件開發(fā)
//形式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);
//形參是$,函數(shù)定義完成之后,把jQuery這個實參傳遞進去.立即調(diào)用執(zhí)行。
//這樣的好處是,我們在寫jQuery插件時,也可以使用$這個別名,而不會與prototype引起沖突

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

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

32.$.map和$.each有什么區(qū)別

map()方法主要用來遍歷操作數(shù)組和對象,會返回一個新的數(shù)組。$.map()方法適用于將數(shù)組或?qū)ο竺總€項目新陣列映射到一個新數(shù)組的函數(shù);
each()主要用于遍歷jquery對象,返回的是原來的數(shù)組,并不會新創(chuàng)建一個數(shù)組。

33.編寫一個 getElementsByClassName 封裝函數(shù)?

<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.簡述下工作流程

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

35.一般使用什么版本控制工具?svn如何對文件加鎖

svn加鎖目的:為了避免多個人同一時間對同一個文件改動的相互覆蓋,版本控制系統(tǒng)就必須有一套沖突處理機制。

svn加鎖兩種策略:樂觀加鎖:所有簽出的文件都是可讀寫的,對文件的修改不必獲得文件的鎖,當(dāng)你修改完文件簽入時,會首先要求你更新本地文件,版本控制系統(tǒng)不會覆蓋你的本地修改,而是會讓你自己合并沖突后簽入。

嚴(yán)格加鎖:所有簽出的文件都是只讀的,任何對文件的修改必須要獲得文件的鎖,如果其他人沒有擁有該文件的鎖,那么版本控制系統(tǒng)就會授權(quán)給你文件的鎖,并將文件設(shè)置為可編輯的。

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

嚴(yán)格加鎖:在想要采取嚴(yán)格加鎖的文件或目錄上點擊右鍵,使用TortoiseSVN 屬性菜單,點擊新建屬性,選擇需要鎖定。

36. git 和 svn的區(qū)別?

SVN是集中式版本控制系統(tǒng),版本庫是集中放在中央服務(wù)器的,而干活的時候,用的都是自己的電腦,所以首先要從中央服務(wù)器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服務(wù)器。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作,如果在局域網(wǎng)還可以,帶寬夠大,速度夠快,如果在互聯(lián)網(wǎng)下,如果網(wǎng)速慢的話,就納悶了。

Git是分布式版本控制系統(tǒng),那么它就沒有中央服務(wù)器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯(lián)網(wǎng)了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協(xié)作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

37. jquery和zepto有什么區(qū)別?

1.針對移動端程序,Zepto有一些基本的觸摸事件可以用來做觸摸屏交互(tap事件、swipe事件),Zepto是不支持IE瀏覽器的,這不是Zepto的開發(fā)者Thomas Fucks在跨瀏覽器問題上犯了迷糊,而是經(jīng)過了認(rèn)真考慮后為了降低文件尺寸而做出的決定,就像jQuery的團隊在2.0版中不再支持舊版的IE(6 7 8)一樣。因為Zepto使用jQuery句法,所以它在文檔中建議把jQuery作為IE上的后備庫。那樣程序仍能在IE中,而其他瀏覽器則能享受到Zepto在文件大小上的優(yōu)勢,然而它們兩個的API不是完全兼容的,所以使用這種方法時一定要小心,并要做充分的測試。

2.Dom操作的區(qū)別:添加id時jQuery不會生效而Zepto會生效。

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

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

window.onload:用于當(dāng)頁面的所有元素,包括外部引用文件,圖片等都加載完畢時運行函數(shù)內(nèi)的函數(shù)。load方法只能執(zhí)行一次,如果在js文件里寫了多個,只能執(zhí)行最后一個。

$(document).ready(function(){})和$(function(){})都是用于當(dāng)頁面的標(biāo)準(zhǔn)DOM元素被解析成DOM樹后就執(zhí)行內(nèi)部函數(shù)。這個函數(shù)是可以在js文件里多次編寫的,對于多人共同編寫的js就有很大的優(yōu)勢,因為所有行為函數(shù)都會執(zhí)行到。而且$(document).ready()函數(shù)在HMTL結(jié)構(gòu)加載完后就可以執(zhí)行,不需要等大型文件加載或者不存在的連接等耗時工作完成才執(zhí)行,效率高。

39. Jq中 attr 和 prop 有什么區(qū)別

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

40. 簡述下 this 和定義屬性和方法的時候有什么區(qū)別?Prototype?

this表示當(dāng)前對象,如果在全局作用范圍內(nèi)使用this,則指代當(dāng)前頁面對象window; 如果在函數(shù)中使用this,則this指代什么是根據(jù)運行時此函數(shù)在什么對象上被調(diào)用。 我們還可以使用apply和call兩個全局方法來改變函數(shù)中this的具體指向。

prototype本質(zhì)上還是一個JavaScript對象。 并且每個函數(shù)都有一個默認(rèn)的prototype屬性。

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

41. 什么是預(yù)編譯語音|預(yù)編譯處理器?

Sass是一種CSS預(yù)處理器語言,通過編程方式生成CSS代碼。因為可編程,所以操控靈活性自由度高,方便實現(xiàn)一些直接編寫CSS代碼較困難的代碼。

同時,因為Sass是生成CSS的語言,所以寫出來的Sass文件是不能直接用的,必須經(jīng)過編譯器編譯成CSS文件才能使用。

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

42.ajax 和 jsonp ?

ajax和jsonp的區(qū)別:
相同點:都是請求一個url
不同點:ajax的核心是通過xmlHttpRequest獲取內(nèi)容
jsonp的核心則是動態(tài)添加<script>標(biāo)簽來調(diào)用服務(wù)器 提供的js腳本。

43.ajax執(zhí)行流程?

1. 創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調(diào)用對象
2. 創(chuàng)建一個新的HTTP請求,并指定該HTTP請求的方法、URL及驗證信息
3. 設(shè)置響應(yīng)HTTP請求狀態(tài)變化的函數(shù)
4. 發(fā)送HTTP請求
5. 獲取異步調(diào)用返回的數(shù)據(jù)
6. 使用JavaScript和DOM實現(xiàn)局部刷新

44.xhr對象 status ? readystate?

status是XMLHttpRequest對象的一個屬性,表示響應(yīng)的HTTP狀態(tài)碼。
readyState是XMLHttpRequest對象的一個屬性,用來標(biāo)識當(dāng)前XMLHttpRequest對象處于什么狀態(tài)。

45.readystate 0~4

0:未初始化狀態(tài):此時,已經(jīng)創(chuàng)建了一個XMLHttpRequest對象
1: 準(zhǔn)備發(fā)送狀態(tài):此時,已經(jīng)調(diào)用了XMLHttpRequest對象的open方法,并且XMLHttpRequest對象已經(jīng)準(zhǔn)備好將一個請求發(fā)送到服務(wù)器端
2:已經(jīng)發(fā)送狀態(tài):此時,已經(jīng)通過send方法把一個請求發(fā)送到服務(wù)器端,但是還沒有收到一個響應(yīng)
3:正在接收狀態(tài):此時,已經(jīng)接收到HTTP響應(yīng)頭部信息,但是消息體部分還沒有完全接收到
4:完成響應(yīng)狀態(tài):此時,已經(jīng)完成了HTTP響應(yīng)的接收

46.說出幾個http協(xié)議狀態(tài)碼?

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

200:請求成功
201:請求成功并且服務(wù)器創(chuàng)建了新的資源
302:服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來響應(yīng)以后的請求。
304:自從上次請求后,請求的網(wǎng)頁未修改過。服務(wù)器返回此響應(yīng)時,不會返回網(wǎng)頁內(nèi)容。
400:服務(wù)器不理解請求的語法。
404:請求的資源(網(wǎng)頁等)不存在
500: 內(nèi)部服務(wù)器錯誤

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

主要負責(zé)哪些就講主要做哪些功能模塊:

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

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

48.sessionStorage和localstroage與cookie之間有什么關(guān)聯(lián), cookie最大存放多少字節(jié)

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

區(qū)別:
1、cookie在瀏覽器和服務(wù)器間來回傳遞。而sessionStorage和localStorage不會自動把數(shù)據(jù)發(fā)給服務(wù)器,僅在本地保存

2、存儲大小限制也不同,cookie數(shù)據(jù)不能超過4k,sessionStorage和localStorage 但比cookie大得多,可以達到5M

3、數(shù)據(jù)有效期不同,sessionStorage:僅在當(dāng)前瀏覽器窗口關(guān)閉前有效,自然也就不可能持久保持;localStorage:始終有效,窗口或瀏覽器關(guān)閉也一直保存,因此用作持久數(shù)據(jù);cookie只在設(shè)置的cookie過期時間之前一直有效,即使窗口或瀏覽器關(guān)閉

4、作用域不同,sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個頁面(即數(shù)據(jù)不共享);localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的( 即數(shù)據(jù)共享 )。

49.ajax中 get 和 post 有什么區(qū)別?

get和post都是數(shù)據(jù)提交的方式。
get的數(shù)據(jù)是通過網(wǎng)址問號后邊拼接的字符串進行傳遞的。post是通過一個HTTP包體進行傳遞數(shù)據(jù)的。
get的傳輸量是有限制的,post是沒有限制的。
get的安全性可能沒有post高,所以我們一般用get來獲取數(shù)據(jù),post一般用來修改數(shù)據(jù)。

50.Gc機制是什么?為什么閉包不會被回收變量和函數(shù)?

1、Gc垃圾回收機制;
2、外部變量沒釋放,所以指向的大函數(shù)內(nèi)的小函數(shù)也釋放不了

51.簡述下你理解的面向?qū)ο螅?/strong>

萬物皆對象,把一個對象抽象成類,具體上就是把一個對象的靜態(tài)特征和動態(tài)特征抽象成屬性和方法,也就是把一類事物的算法和數(shù)據(jù)結(jié)構(gòu)封裝在一個類之中,程序就是多個對象和互相之間的通信組成的.

面向?qū)ο缶哂蟹庋b性,繼承性,多態(tài)性。
封裝:隱蔽了對象內(nèi)部不需要暴露的細節(jié),使得內(nèi)部細節(jié)的變動跟外界脫離,只依靠接口進行通信.封裝性降低了編程的復(fù)雜性. 通過繼承,使得新建一個類變得容易,一個類從派生類那里獲得其非私有的方法和公用屬性的繁瑣工作交給了編譯器. 而繼承和實現(xiàn)接口和運行時的類型綁定機制 所產(chǎn)生的多態(tài),使得不同的類所產(chǎn)生的對象能夠?qū)ο嗤南⒆鞒霾煌姆磻?yīng),極大地提高了代碼的通用性.

總之,面向?qū)ο蟮奶匦蕴岣吡舜笮统绦虻闹赜眯院涂删S護性.

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 含義要豐富得多,它可以是全局對象、當(dāng)前對象或者任意對象,這完全取決于函數(shù)的調(diào)用方式。

53.你對數(shù)據(jù)校驗是怎么樣處理的?jquery.validate?

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

54.如何對登錄的賬號密碼進行加密?

Md5

55.在jq中 mouseover mouseenter mouseout mouseleave 和 hover有什么關(guān)聯(lián)?

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

mouseout與mouseleave:
不論鼠標(biāo)離開被選元素還是任何子元素,都會觸發(fā)mouseout事件。
只有在鼠標(biāo)指針離開被選元素時,才會觸發(fā)mouseleave事件。

hover:
hover是一個符合方法,相當(dāng)于mouseenter+mouseleave。

56.jsonp原理? 缺點?

工作原理:使用script標(biāo)簽實現(xiàn)跨域訪問,可在url中指定回調(diào)函數(shù),獲取JSON數(shù)據(jù)并在指定的回調(diào)函數(shù)中執(zhí)行jquery實現(xiàn)jsop。

缺點:只支持GET方式的jsonp實現(xiàn),是一種腳本注入行為存在一定的安全隱患。如果返回的數(shù)據(jù)格式有問題或者返回失敗了,并不會報錯。

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

javascript跨域有兩種情況:
1、基于同一父域的子域之間,如:http://a.c.comhttp://b.c.com
2、基于不同的父域之間,如:http://www.a.comhttp://www.b.com
3、端口的不同,如:http://www.a.com:8080http://www.a.com:8088
4、協(xié)議不同,如:http://www.a.comhttps://www.a.com

對于情況3和4,需要通過后臺proxy來解決,具體方式如下:
a、在發(fā)起方的域下創(chuàng)建proxy程序
b、發(fā)起方的js調(diào)用本域下的proxy程序
c、proxy將請求發(fā)送給接收方并獲取相應(yīng)數(shù)據(jù)
d、proxy將獲得的數(shù)據(jù)返回給發(fā)起方的js

代碼和ajax調(diào)用一致,其實這種方式就是通過ajax進行調(diào)用的
而情況1和2除了通過后臺proxy這種方式外,還可以有多種辦法來解決:
1、document.domain+iframe(只能解決情況1):
a、在發(fā)起方頁面和接收方頁面設(shè)置document.domain,并將值設(shè)為父域的主域名(window.location.hostname)
b、在發(fā)起方頁面創(chuàng)建一個隱藏的iframe,iframe的源是接收方頁面
c、根據(jù)瀏覽器的不同,通過iframe.contentDocument || iframe.contentWindow.document來獲得接收方頁面的內(nèi)容
d、通過獲得的接收方頁面的內(nèi)容來與接收方進行交互
這種方法有個缺點,就是當(dāng)一個域被攻擊時,另一個域會有安全漏洞出現(xiàn)。

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

由于sessionStorage - 針對一個 session 的數(shù)據(jù)存儲,所以我們一般利用localStorage儲存js文件,只有在第一次訪問該頁面的時候加載js文件,以后在訪問的時候加載本地localStorage執(zhí)行

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

在Ajax中使用Get請求數(shù)據(jù)不會有頁面緩存的問題,而使用POST請求可是有時候頁面會緩存我們提交的信息,導(dǎo)致我們發(fā)送的異步請求不能正確的返回我們想要的數(shù)據(jù)

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

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

60.split() join()?

前者是切割成數(shù)組的形式,
后者是將數(shù)組轉(zhuǎn)換成字符串

61.slice() splice()?

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

62.typeof?typeof [ ]返回數(shù)據(jù)類型是?

//判斷基本數(shù)據(jù)類型;var a=[];typeof a輸出object;
//本來判斷一個對象類型用typeof是最好的,不過對于Array類型是不適用的,
//可以使用 instanceof操作符:
       var arrayStr=new Array("1","2","3","4","5");    
       alert(arrayStr instanceof Array); 
//當(dāng)然以上在一個簡單的頁面布局里面是沒有問題的,如果是復(fù)雜頁面情況,
//入獲取的是frame內(nèi)部的Array對象,可以用這個函數(shù)判斷:
       function isArray(obj) {      
          return Object.prototype.toString.call(obj) === '[object Array]';       
       }

63.disabled readyonly?

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

64.同步異步?

1、進程同步:就是在發(fā)出一個功能調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事

2、異步的概念和同步相對。當(dāng)一個異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。實際處理這個調(diào)用的部件在完成后,通過狀態(tài)、通知和回調(diào)來通知調(diào)用者。

65.promise

Promise的構(gòu)造函數(shù)接收一個參數(shù),是函數(shù),并且傳入兩個參數(shù):resolve,reject,分別表示異步操作執(zhí)行成功后的回調(diào)函數(shù)和異步操作執(zhí)行失敗后的回調(diào)函數(shù)。

66.函數(shù)fn1 函數(shù)fn2 函數(shù)fn3,如果想在三個函數(shù)都執(zhí)行完成后執(zhí)行某一個事件應(yīng)該如何實現(xiàn)?

//1、設(shè)置事件監(jiān)聽。
//2、回調(diào)函數(shù):
function fn1(){
       console.log("執(zhí)行fn1");
       fn2();
}
function fn2(){
       console.log("執(zhí)行fn2");
       fn3();
}
function fn3(){
       console.log("執(zhí)行fn3");
       mou();
}
function mou(){
       console.log("執(zhí)行某個函數(shù)");
}
fn1();

67.JavaScript提供了哪幾種“異步模式”?

1、回調(diào)函數(shù)(callbacks)
2、事件監(jiān)聽
3、Promise對象

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

移動端300ms延遲:假定這么一個場景。用戶在 瀏覽器里邊點擊了一個鏈接。由于用戶可以進行雙擊縮放或者雙擊滾動的操作,當(dāng)用戶一次點擊屏幕之后,瀏覽器并不能立刻判斷用戶是確實要打開這個鏈接,還是想要進行雙擊操作。因此,瀏覽器 就等待 300 毫秒,以判斷用戶是否再次點擊了屏幕。也就是說,當(dāng)我們點擊頁面的時候移動端瀏覽器并不是立即作出反應(yīng),而是會等上一小會兒才會出現(xiàn)點擊的效果。

點擊穿透:假如頁面上有兩個元素A和B。B元素在A元素之上。我們在B元素的touchstart事件上注冊了一個回調(diào)函數(shù),該回調(diào)函數(shù)的作用是隱藏B元素。我們發(fā)現(xiàn),當(dāng)我們點擊B元素,B元素被隱藏了,隨后,A元素觸發(fā)了click事件。這是因為在移動端瀏覽器,事件執(zhí)行的順序是touchstart > touchend > click。而click事件有300ms的延遲,當(dāng)touchstart事件把B元素隱藏之后,隔了300ms,瀏覽器觸發(fā)了click事件,但是此時B元素不見了,所以該事件被派發(fā)到了A元素身上。如果A元素是一個鏈接,那此時頁面就會意外地跳轉(zhuǎn)。

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

(2) 更改默認(rèn)的視口寬度 (響應(yīng)式布局,消除了站點上可能存在的雙擊綻放的請求)
<meta name=”viewport” content=”width=device-width”/>

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

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

69.變量作用域?

//變量作用域:一個變量的作用域是程序源代碼中定義這個變量的區(qū)域。全局變量擁有全局作用域,
//在js代碼中任何地方都是有定義的。在函數(shù)內(nèi)聲明的變量只在函數(shù)體內(nèi)有定義,它們是局部變量,
//作用域是局部性的。函數(shù)參數(shù)也是局部變量,它們只在函數(shù)體內(nèi)有定義。
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 兩者之間的區(qū)別

call和apply都是改變this指向的方法,區(qū)別在于call可以寫多個參數(shù),而apply只能寫兩個參數(shù),第二個參數(shù)是一個數(shù)組,用于存放要傳的參數(shù)。

71.call和apply 有什么好處?

用call和apply:實現(xiàn)更好的繼承和擴展,更安全。

72.誰是c的構(gòu)造函數(shù)?

function ab() {
         this.say = ""; } 
ab.constructor = {} ab.name = ''; 
var c = new ab(); 
//構(gòu)造函數(shù)默認(rèn)指向函數(shù)本身,ab是一個類,它的構(gòu)造函數(shù)是它本身,
//然后ab.constructor={};ab的構(gòu)造函數(shù)就指向{}了,c是ab的實例化對象,c的構(gòu)造函數(shù)就是{}
//通過使用new的時候,創(chuàng)建對象發(fā)生了那些改變? 當(dāng)使用new操作時,會馬上開辟一個塊內(nèi)存,
//創(chuàng)建一個空對象,并將this指向這個對象。接著,執(zhí)行構(gòu)造函數(shù)ab(),對這個空對象進行構(gòu)造
//(構(gòu)造函數(shù)里有什么屬性和方法都一一給這個空白對象裝配上去,這就是為何它叫構(gòu)造函數(shù)了)。 

73.sass和less有什么區(qū)別?

1.編譯環(huán)境不一樣 Sass的安裝需要Ruby環(huán)境,是在服務(wù)端處理的,而Less是需要引入less.js來處理Less代碼輸出css到瀏覽器,也可以在開發(fā)環(huán)節(jié)使用Less,然后編譯成css文件,直接放到項目中。

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

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

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

5.引用外部css文件,sass引用外部文件必須以開頭,文件名如果以下劃線形狀,sass會認(rèn)為該文件是一個引用文件,不會將其編譯為css文件。less引用外部文件和css中的@import沒什么差異。

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

總結(jié):不管是sass,還是less,都可以視為一種基于CSS之上的高級語言,其目的是使得CSS開發(fā)更靈活和更強大,sass的功能比less強大,基本可以說是一種真正的編程語言了,less則相對清晰明了,易于上手,對編譯環(huán)境要求比較寬松。考慮到編譯sass要安裝Ruby,而Ruby官網(wǎng)在國內(nèi)訪問不了,個人在實際開發(fā)中更傾向于選擇less。

74.bootstrap好處?

自適應(yīng)和響應(yīng)式布局,12柵格系統(tǒng),統(tǒng)一的界面風(fēng)格和css樣式有利于團隊開發(fā)。編寫靈活、穩(wěn)定、高質(zhì)量的 HTML 和 CSS 代碼的規(guī)范。

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

本人開發(fā)時,利用gulp等前端工作流管理工具管理項目。 gulp是新一代的前端項目構(gòu)建工具,你可以使用gulp及其插件對你的項目代碼(less,sass)進行編譯,還可以壓縮你的js和css代碼,甚至壓縮你的圖片,能夠合并文件,壓縮文件,語法檢查,監(jiān)聽文件變化,測試,轉(zhuǎn)換二進制,轉(zhuǎn)換圖片等一系列功能。gulp僅有少量的API,所以非常容易學(xué)習(xí)。實現(xiàn)良好的項目管理。

76.壓縮合并目的?http請求的優(yōu)化方式?

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

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

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

圖片js/css等靜態(tài)資源放在靜態(tài)服務(wù)器或CDN服時,盡量采用不用的域名,這樣能防止cookie不會互相污染,減少每次請求的往返數(shù)據(jù)。

css替代圖片, 緩存一些數(shù)據(jù)

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

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

1)$.get(url,[data],[callback])
2)$.getJSON(url,[data],[callback])
3)$.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();
在默認(rèn)情況下,.clone()方法不會復(fù)制匹配的元素或其后代元素中綁定的事件。不過,可以為這個方法傳遞一個布爾值參數(shù),將這個參數(shù)設(shè)置為true, 就可以連同事件一起復(fù)制,即.clone(true)。

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

數(shù)組的排序方法:reverse()和sort()。reverse()方法會對反轉(zhuǎn)數(shù)組項的順序。
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 方法:返回一個值,指出在當(dāng)前的區(qū)域設(shè)置中兩個字符串是否相同。

80.簡述一下你理解的面向?qū)ο螅?/strong>

面向?qū)ο笫腔谌f物皆對象這個哲學(xué)觀點. 把一個對象抽象成類,具體上就是把一個對象的靜態(tài)特征和動態(tài)特征抽象成屬性和方法,也就是把一類事物的算法和數(shù)據(jù)結(jié)構(gòu)封裝在一個類之中,程序就是多個對象和互相之間的通信組成的.

面向?qū)ο缶哂蟹庋b性,繼承性,多態(tài)性。

封裝:隱蔽了對象內(nèi)部不需要暴露的細節(jié),使得內(nèi)部細節(jié)的變動跟外界脫離,只依靠接口進行通信.封裝性降低了編程的復(fù)雜性. 通過繼承,使得新建一個類變得容易,一個類從派生類那里獲得其非私有的方法和公用屬性的繁瑣工作交給了編譯器. 而 繼承和實現(xiàn)接口和運行時的類型綁定機制 所產(chǎn)生的多態(tài),使得不同的類所產(chǎn)生的對象能夠?qū)ο嗤南⒆鞒霾煌姆磻?yīng),極大地提高了代碼的通用性.

總之,面向?qū)ο蟮奶匦蕴岣吡舜笮统绦虻闹赜眯院涂删S護性.

81.如何創(chuàng)建一個對象?

1. 工廠模式
2. 構(gòu)造函數(shù)模式
3. 原型模式
4. 混合構(gòu)造函數(shù)和原型模式
5. 動態(tài)原型模式
6. 寄生構(gòu)造函數(shù)模式
7. 穩(wěn)妥構(gòu)造函數(shù)模式

程序的設(shè)計模式?工廠模式?發(fā)布訂閱?
1)設(shè)計模式并不是某種語言的某塊代碼,設(shè)計模式是一種思想,提供給在編碼時候遇到的各種問題是可以采取的解決方案,更傾向于一種邏輯思維,而不是萬能代碼塊。
設(shè)計模式主要分三個類型:創(chuàng)建型、結(jié)構(gòu)型和行為型。
創(chuàng)建型模式:單例模式,抽象工廠模式,建造者模式,工廠模式與原型模式。
結(jié)構(gòu)型模式:適配器模式,橋接模式,裝飾者模式,組合模式,外觀模式,享元模式以及代理模式。
行為型模式:模板方法模式,命令模式,迭代器模式,觀察者模式,中介者模式,備忘錄模式,解釋器模式,狀態(tài)模式,策略模式,職責(zé)鏈模式和訪問者模式。

2)與創(chuàng)建型模式類似,工廠模式創(chuàng)建對象(視為工廠里的產(chǎn)品)是無需指定創(chuàng)建對象的具體類。
工廠模式定義一個用于創(chuàng)建對象的接口,這個接口由子類決定實例化哪一個類。該模式使一個類的實例化延遲到了子類。而子類可以重寫接口方法以便創(chuàng)建的時候指定自己的對象類型。

3)觀察者模式又叫做發(fā)布訂閱模式,它定義了一種一對多的關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象,這個主題對象的狀態(tài)發(fā)生改變時就會通知所有觀察著對象。它是由兩類對象組成,主題和觀察者,主題負責(zé)發(fā)布事件,同時觀察者通過訂閱這些事件來觀察該主體,發(fā)布者和訂閱者是完全解耦的,彼此不知道對方的存在,兩者僅僅共享一個自定義事件的名稱。
( 設(shè)計模式實在是太高深了,小伙伴門結(jié)合網(wǎng)上實例自行學(xué)習(xí),我實在是無能為力啊 )

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

1.CommonJS就是為JS的表現(xiàn)來制定規(guī)范,NodeJS是這種規(guī)范的實現(xiàn),webpack 也是以CommonJS的形式來書寫。因為js沒有模塊的功能,所以CommonJS應(yīng)運而生。但它不能在瀏覽器中運行。 CommonJS定義的模塊分為:{模塊引用(require)} {模塊定義(exports)} {模塊標(biāo)識(module)}

2.RequireJS 是一個JavaScript模塊加載器。 RequireJS有兩個主要方法(method): define()和require()。這兩個方法基本上擁有相同的定義(declaration) 并且它們都知道如何加載的依賴關(guān)系,然后執(zhí)行一個回調(diào)函數(shù)(callback function)。與require()不同的是, define()用來存儲代碼作為一個已命名的模塊。 因此define()的回調(diào)函數(shù)需要有一個返回值作為這個模塊定義。這些類似被定義的模塊叫作AMD (Asynchronous Module Definition,異步模塊定義)。

3.AMD 是 RequireJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出 AMD異步加載模塊。它的模塊支持對象 函數(shù) 構(gòu)造器 字符串 JSON等各種類型的模塊。 適用AMD規(guī)范適用define方法定義模塊。

4.CMD是SeaJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出
AMD與CDM的區(qū)別:
(1)對于于依賴的模塊,AMD 是提前執(zhí)行(好像現(xiàn)在也可以延遲執(zhí)行了),CMD 是延遲執(zhí)行。
(2)AMD 推崇依賴前置,CMD 推崇依賴就近。
(3)AMD 推崇復(fù)用接口,CMD 推崇單用接口。
(4)書寫規(guī)范的差異。

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

83. js的幾種繼承方式?

1.使用對象冒充實現(xiàn)繼承
2.采用call、Apply方法改變函數(shù)上下文實現(xiàn)繼承
3.原型鏈方式繼承

84. JavaScript原型,原型鏈 ? 有什么特點?

在JavaScript中,一共有兩種類型的值,原始值和對象值.每個對象都有一個內(nèi)部屬性[[prototype]],我們通常稱之為原型.原型的值可以是一個對象,也可以是null.如果它的值是一個對象,則這個對象也一定有自己的原型.這樣就形成了一條線性的鏈,我們稱之為原型鏈.

訪問一個對象的原型可以使用ES5中的Object.getPrototypeOf方法,或者ES6中的proto屬性. 原型鏈的作用是用來實現(xiàn)繼承,比如我們新建一個數(shù)組,數(shù)組的方法就是從數(shù)組的原型上繼承而來的。

85. eval是做什么的?

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

86. null,undefined 的區(qū)別?

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

87. JSON 的了解?

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

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

defer和async、動態(tài)創(chuàng)建DOM方式(用得最多)、按需異步載入js

89. ajax 是什么?

異步j(luò)avascript和XML,是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。通過后臺與服務(wù)器進行少量數(shù)據(jù)交換,AJAX可以使網(wǎng)頁實現(xiàn)異步更新。這意味著可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行更新。

90. 同步和異步的區(qū)別?

javascript同步表示sync,指:代碼依次執(zhí)行 javascript異步表示async,指:代碼執(zhí)行不按順序,‘跳過’執(zhí)行,待其他某些代碼執(zhí)行完后再來執(zhí)行,成為異步。

91. 如何解決跨域問題?

Jsonp、iframe、window.name、window.postMessage、服務(wù)器上設(shè)置代理頁面

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

(1) defer,只支持IE
(2) async:true
(3) 創(chuàng)建script,插入到DOM中,加載完畢后callBack

93. jQuery與jQuery UI 有啥區(qū)別?

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

94. 你有哪些性能優(yōu)化的方法?

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

(2) 前端模板 JS+數(shù)據(jù),減少由于HTML標(biāo)簽導(dǎo)致的帶寬浪費,前端用變量保存AJAX請求結(jié)果,每次操作本地變量,不用請求,減少請求次數(shù)

(3) 用innerHTML代替DOM操作,減少DOM操作次數(shù),優(yōu)化javascript性能。

(4) 當(dāng)需要設(shè)置的樣式很多時設(shè)置className而不是直接操作style。

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

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

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

(8) 避免在頁面的主體布局中使用table,table要等其中的內(nèi)容完全下載之后才會顯示出來,顯示比div+css布局慢。

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

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

瀏覽器這邊做的工作大致分為以下幾步:
加載:根據(jù)請求的URL進行域名解析,向服務(wù)器發(fā)起請求,接收文件(HTML、JS、CSS、圖象等)。
解析:對加載到的資源(HTML、JS、CSS等)進行語法解析,建議相應(yīng)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(比如HTML的DOM樹,JS的(對象)屬性表,CSS的樣式規(guī)則等等)

96. ajax的缺點

1、ajax不支持瀏覽器back按鈕。
2、安全問題 AJAX暴露了與服務(wù)器交互的細節(jié)。
3、對搜索引擎的支持比較弱。
4、破壞了程序的異常機制。
5、不容易調(diào)試

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內(nèi)容