您的位置:首頁>正文

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

1.幾種基底資料型別?複雜資料類型?數值型別和引用資料類型?堆疊資料結構?

基底資料型別:Undefined、Null、Boolean、Number、String數值型別:數值、布林值、null、undefined。 參考類型:物件、陣列、函數。 堆疊資料結構:是一種支援後進先出(LIFO)的集合,即後被插入的資料,先被取出!js陣列中提供了以下幾個方法可以讓我們很方便實現堆疊:shift:從陣列中把第一個元素刪除, 並返回這個元素的值。 unshift:在陣列的開頭添加一個或更多元素, 並返回新的長度push:在陣列的中末尾添加元素, 並返回新的長度pop:從陣列中把最後一個元素刪除, 並返回這個元素的值。

2.聲明函數作用提升?聲明變數和聲明函數的提升有什麼區別?

(1)變數聲明提升:變數申明在進入執行上下文就完成了。 只要變數在代碼中進行了聲明, 無論它在哪個位置上進行聲明, js引擎都會將它的聲明放在範圍作用域的頂部;(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);

3.判斷資料類型?

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

4.非同步程式設計?

方法1:回呼函數, 優點是簡單、容易理解和部署, 缺點是不利於代碼的閱讀和維護, 各個部分之間高度耦合(Coupling), 流程會很混亂, 而且每個任務只能指定一個回呼函數。 方法2:時間監聽, 可以綁定多個事件, 每個事件可以指定多個回呼函數, 而且可以“去耦合”(Decoupling), 有利於實現模組化。 缺點是整個程式都要變成事件驅動型, 運行流程會變得很不清晰。
方法3:發佈/訂閱, 性質與“事件監聽”類似, 但是明顯優於後者。 方法4:Promises物件, 是CommonJS工作組提出的一種規範, 目的是為非同步程式設計提供統一介面。 簡單說, 它的思想是, 每一個非同步任務返回一個Promise物件, 該物件有一個then方法, 允許指定回呼函數。

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

事件流:從頁面中接收事件的順序。 也就是說當一個事件產生時, 這個事件的傳播過程, 就是事件流。 IE中的事件流叫事件冒泡;事件冒泡:事件開始時由最具體的元素接收, 然後逐級向上傳播到較為不具體的節點(文檔)。 對於html來說, 就是當一個元素產生了一個事件, 它會把這個事件傳遞給它的父元素, 父元素接收到了之後, 還要繼續傳遞給它的上一級元素,
就這樣一直傳播到document物件(親測現在的流覽器到window物件, 只有IE8及下不這樣事件捕獲是不太具體的元素應該更早接受到事件, 而最具體的節點應該最後接收到事件。 他們的用意是在事件到達目標之前就捕獲它;也就是跟冒泡的過程正好相反, 以html的click事件為例, document物件(DOM級規範要求從document開始傳播, 但是現在的流覽器是從window物件開始的)最先接收到click事件的然後事件沿著DOM樹依次向下傳播, 一直傳播到事件的實際目標;這篇文章分享之前我還是要推薦下我自己的前端群:523218370, 群裡每天分享對應的學習資料, 歡迎初學和進階中的小夥伴。

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.externalWindow物件的屬性如下: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的第一個參數使用字串而非函數的話,會引發記憶體洩漏。閉包、控制台日誌、迴圈(在兩個物件彼此引用且彼此保留時,就會產生一個迴圈)防止記憶體洩露:1、不要動態繫結事件;2、不要在動態添加,或者會被動態移除的dom上綁事件,用事件冒泡在父容器監聽事件;3、如果要違反上面的原則,必須提供destroy方法,保證移除dom後事件也被移除,這點可以參考Backbone的原始程式碼,做的比較好;4、單例化,少創建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.自執行函數?用於什麼場景?好處?

自執行函數:1、聲明一個匿名函數2、馬上調用這個匿名函數。作用:創建一個獨立的作用域。好處:防止變數彌散到全域,以免各種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?

1、創建一個空物件,並且 this變數引用該物件,同時還繼承了該函數的原型。 2、屬性和方法被加入到 this引用的物件中。3、新創建的物件由 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=[123];

var arr2=[456];

arr1 = arr1.concat(arr2);

console.log(arr1);

(2)var arr1=[123];

var arr2=[456];

Array.prototype.push.apply(arr1arr2);

console.log(arr1);

(3)var arr1=[123];

var arr2=[456];

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"parseIntparseFloatJSON.parseJSON.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;這個函數歸還$的名稱控制權給另一個庫,因此可以在頁面上使用其他庫。這時,我們可以用"jQuery "這個名稱調用jQuery的功能。 $.noConflict; jQuery('#id').hide; .....//或者給jQuery一個別名 var $j=jQuery $j('#id').hide; .....方法二: (function($){})(jQuery)方法三: jQuery(function($){})通過傳遞一個函數作為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內置選擇器

if($("#test").is(":hidden")){ $("#test").show; //如果元素為隱藏,則將它顯現 }else{ $("#test").hide; //如果元素為顯現,則將其隱藏 }//第三種:jQuery判斷元素是否顯示是否隱藏var node=$('#id');if(node.is(':hidden')){//如果node是隱藏的則顯示node元素,否則隱藏node.show;}else{node.hide;}

這篇文章分享之前我還是要推薦下我自己的前端群:523218370,群裡每天分享對應的學習資料,歡迎初學和進階中的小夥伴。

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

點擊穿透現象有3種:點擊穿透問題:點擊蒙層(mask)上的關閉按鈕,蒙層消失後發現觸發了按鈕下面元素的click事件跨頁面點擊穿透問題:如果按鈕下面恰好是一個有href屬性的a標籤,那麼頁面就會發生跳轉另一種跨頁面點擊穿透問題:這次沒有mask了,直接點擊頁內按鈕跳轉至新頁,然後發現新頁面中對應位置元素的click事件被觸發了解決方案:1、只用touch最簡單的解決方案,完美解決點擊穿透問題把頁面內所有click全部換成touch事件( touchstart 、’touchend’、’tap’)2、只用click下下策,因為會帶來300ms延遲,頁面內任何一個自訂交互都將增加300毫秒延遲3、tap後延遲350ms再隱藏mask改動最小,缺點是隱藏mask變慢了,350ms還是能感覺到慢的4、pointer-events比較麻煩且有缺陷,不建議使用mask隱藏後,給按鈕下面元素添上 pointer-events: none;樣式,讓click穿過去,350ms後去掉這個樣式,恢復回應缺陷是mask消失後的的350ms內,使用者可以看到按鈕下面的元素點著沒反應,如果用戶手速很快的話一定會發現

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

jQuery中提供了四種事件監聽方式,分別是bind、live、delegate、on,對應的解除監聽的函數分別是unbind、die、undelegate、offBind是使用頻率較高的一種,作用就是在選擇到的元素上綁定特定事件類型的監聽函數;Live可以對後生成的元素也可以綁定相應的事件,處理機制就是把事件綁定在DOM樹的根節點上,而不是直接綁定在某個元素上;Delegate採用了事件委託的概念,不是直接為子元素綁定事件,而是為其父元素(或父項目也可)綁定事件,當在div內任意元素上點擊時,事件會一層層從event target向上冒泡,直至到達你為其綁定事件的元素;on方法可以綁定動態添加到頁面元素的事件,on方法綁定事件可以提升效率;

28.Jq中如何將一個jq物件轉化為dom物件?

方法一:jQuery物件是一個資料物件,可以通過[index]的方法,來得到相應的DOM物件。如:var $v =$("#v") ; //jQuery對象 var v=$v[0]; //DOM對象 alert(v.checked) //檢測這個checkbox是否被選中方法二:jQuery本身提供,通過.get(index)方法,得到相應的DOM物件如:var $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(optcallback){ // 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')和$('.ab+div')哪個效率高?

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

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

map方法主要用來遍歷運算元組和物件,會返回一個新的陣列。$.map方法適用於將陣列或物件每個專案新陣列映射到一個新陣列的函數;each主要用於遍歷jquery對象,返回的是原來的陣列,並不會新創建一個陣列。

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

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和 $(document).ready(function{})

window.onload:用於當頁面的所有元素,包括外部引用檔,圖片等都載入完畢時運行函數內的函數。load方法只能執行一次,如果在js檔裡寫了多個,只能執行最後一個。$(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的核心則是動態添加
同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示