更新時(shí)間:2022-12-20 15:26:53 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1139次
作為Java程序員對(duì)于Js絕對(duì)不陌生,而真正的做到深入理解與應(yīng)用,這正是面試過程中對(duì)高級(jí)程序員崗位的硬性需求,這也是目前很多面試者大多的知識(shí)薄弱點(diǎn),今天小編總結(jié)的這套面試題,從起因到原理,讓你順利的度過面試難關(guān):
1.什么是函數(shù)柯里化?
答:是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)。
把接受多個(gè)參數(shù)的函數(shù)轉(zhuǎn)換成接受一個(gè)單一參數(shù)的函數(shù)
// 普通方法
var add = function(x, y) {
return x + y;
}
add(3, 4) //7
// 柯里化 var foo = function(x) {
return function(y) {
return x + y
}
}
foo(3)(4) // 7
2.什么是REST,用起來有什么好處?
答:
REST是一種設(shè)計(jì)API的模式。最常用的數(shù)據(jù)格式是JSON。由于JSON能直接被JavaScript讀取,所以,以JSON格式編寫的REST風(fēng)格的API具有簡單、易讀、易用的特點(diǎn)。通過REST模式設(shè)計(jì)的API可以把web
app 全部功能進(jìn)行封裝,可以很容易的實(shí)現(xiàn)前后端分離,使的前端代碼易編寫,后端代碼易測(cè)試。
一直在測(cè)試REST模式的WEB SERVICE接口,客戶端的HTTP的請(qǐng)求方式一般分為四種:GET、POST、PUT、DELETE,這四種請(qǐng)求方式有什么不同呢。簡單的說,GET就是獲取資源,POST就是創(chuàng)建資源,PUT就是更新資源,DELETE就是刪除資源。具體來說:
PUT:PUT請(qǐng)求是向服務(wù)器端發(fā)送數(shù)據(jù)的,從而改變信息,該請(qǐng)求就像數(shù)據(jù)庫的update操作一樣,用來修改數(shù)據(jù)的內(nèi)容,但是不會(huì)增加數(shù)據(jù)的種類等,也就是說無論進(jìn)行多少次PUT操作,資源不會(huì)增加。
DELETE:DELETE請(qǐng)求顧名思義,就是用來刪除某一個(gè)資源的,該請(qǐng)求就像數(shù)據(jù)庫的delete操作。
GET:GET操作是安全的。所謂安全是指不管進(jìn)行多少次操作,資源的狀態(tài)都不會(huì)改變,GET只是訪問和查看資源。
POST:操作不是安全的,每次請(qǐng)求都會(huì)創(chuàng)建資源,當(dāng)我們多次發(fā)出POST請(qǐng)求后,其結(jié)果是創(chuàng)建出了多個(gè)資源。還有一點(diǎn)需要注意的就是,創(chuàng)建操作可以使用POST,也可以使用PUT,區(qū)別在于POST 是作用在一個(gè)集合資源之上的(/uri),而PUT操作是作用在一個(gè)具體資源之上的(/uri/xxx),再通俗點(diǎn)說,如果URL可以在客戶端確定,那么就使用PUT,如果是在服務(wù)端確定,那么就使用POST,比如說很多資源使用數(shù)據(jù)庫自增主鍵作為標(biāo)識(shí)信息,而創(chuàng)建的資源的標(biāo)識(shí)信息到底是什么只能由服務(wù)端提供,這個(gè)時(shí)候就必須使用POST。
下面說說GET和POST的區(qū)別:
1、GET請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭中),以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如:getCitycode?lat=100.22&lon=35.33
POST把提交的數(shù)據(jù)則放置在是HTTP包的包體中。
2、在瀏覽器上,GET方式提交的數(shù)據(jù)是有限制的,例如有時(shí)候請(qǐng)求的URL太長,會(huì)返回錯(cuò)誤;但如果是客戶端GET請(qǐng)求,是沒有數(shù)據(jù)的限制的。POST沒有限制,可傳較大量的數(shù)據(jù)。
3、POST的安全性要比GET的安全性高。這里所說的安全性和上面GET提到的“安全”不是同個(gè)概念。上面“安全”的含義僅僅是不作數(shù)據(jù)修改,而這里安全的含義是真正的Security的含義,比如:通過GET提交數(shù)據(jù),用戶名和密碼將明文出現(xiàn)在URL上,查看瀏覽器的歷史紀(jì)錄,就可以查看到GET請(qǐng)求的參數(shù),比如登錄的帳號(hào)密碼、搜索關(guān)鍵字、個(gè)人信息等。
PUT和POST方法語義中都有修改資源狀態(tài)的意思,因此都不是安全的。但是PUT方法是冪等的,POST方法不是冪等的,這么設(shè)計(jì)的理由是:
HTTP協(xié)議規(guī)定,POST方法修改資源狀態(tài)時(shí),URL指示的是該資源的父級(jí)資源,待修改資源的ID信息在請(qǐng)求體中攜帶。而PUT方法修改資源狀態(tài)時(shí),URL直接指示待修改資源。因此,同樣是創(chuàng)建資源,重復(fù)提交POST請(qǐng)求可能產(chǎn)生兩個(gè)不同的資源,而重復(fù)提交PUT請(qǐng)求只會(huì)對(duì)其URL中指定的資源起作用,也就是只會(huì)創(chuàng)建一個(gè)資源。
3.什么是變量提升、函數(shù)提升?
答: 變量提升:
簡單說就是在js代碼執(zhí)行前引擎會(huì)先進(jìn)行預(yù)編譯,預(yù)編譯期間會(huì)將變量聲明與函數(shù)聲明提升至其對(duì)應(yīng)作用域的最頂端,函數(shù)內(nèi)聲明的變量只會(huì)提升至該函數(shù)作用域最頂層。
當(dāng)函數(shù)內(nèi)部定義的一個(gè)變量與外部相同時(shí),那么函數(shù)體內(nèi)的這個(gè)變量就會(huì)被上升到最頂端。 舉例來說: console.log(a); //
undefined var a = 3;
//預(yù)編譯后的代碼結(jié)構(gòu)可以看做如下運(yùn)行順序 var a; // 將變量a的聲明提升至最頂端,賦值邏輯不提升。 console.log(a);
// undefined a = 3; // 代碼執(zhí)行到原位置即執(zhí)行原賦值邏輯
函數(shù)提升: 函數(shù)提升只會(huì)提升函數(shù)聲明式寫法,函數(shù)表達(dá)式的寫法不存在函數(shù)提升。
函數(shù)提升的優(yōu)先級(jí)大于變量提升的優(yōu)先級(jí),即函數(shù)提升在變量提升之上。
4.什么是事件冒泡,它是如何工作的?如何阻止事件冒泡?
答:
在一個(gè)對(duì)象上觸發(fā)某類事件(比如單擊onclick事件),如果此對(duì)象定義了此事件的處理程序,那么此事件就會(huì)調(diào)用這個(gè)處理程序,如果沒有定義此事件處理程序或者事件返回true,那么這個(gè)事件會(huì)向這個(gè)對(duì)象的父級(jí)對(duì)象傳播,從里到外,直至它被處理(父級(jí)對(duì)象所有同類事件都將被激活),或者它到達(dá)了對(duì)象層次的最頂層,即document對(duì)象(有些瀏覽器是window)
阻止事件冒泡的幾種方法 第一種: event.stopPropagation(); 第二種: return false; 第三種:
event.preventDefault();
5.簡單說說js中的繼承?
答: 有以下六種方法
1.原型鏈繼承 JavaScript實(shí)現(xiàn)繼承的基本思想:通過原型將一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。
2.借用構(gòu)造函數(shù)繼承(偽造對(duì)象或經(jīng)典繼承) JavaScript實(shí)現(xiàn)繼承的基本思想:在子類構(gòu)造函數(shù)內(nèi)部調(diào)用超類型構(gòu)造函數(shù)。 通過使用apply()和call()方法可以在新創(chuàng)建的子類對(duì)象上執(zhí)行構(gòu)造函數(shù)。
3.組合繼承(原型+借用構(gòu)造)(偽經(jīng)典繼承) JavaScript實(shí)現(xiàn)繼承的基本思想:將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合在一塊,從而發(fā)揮兩者之長的一種繼承模式。
將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一起,從而取長補(bǔ)短發(fā)揮兩者長處的一種繼承模式。
4.原型式繼承 JavaScript實(shí)現(xiàn)繼承的基本思想:借助原型可以基于已有的對(duì)象創(chuàng)建新對(duì)象,同時(shí)還不必須因此創(chuàng)建自定義的類型。
5.寄生式繼承 JavaScript實(shí)現(xiàn)繼承的基本思想:創(chuàng)建一個(gè)僅用于封裝繼承過程的函數(shù),該函數(shù)在內(nèi)部以某種方式來增強(qiáng)對(duì)象,最后再像真正是它做了所有工作一樣返回對(duì)象。
寄生式繼承是原型式繼承的加強(qiáng)版。
6.寄生組合式繼承 JavaScript實(shí)現(xiàn)繼承的基本思想:通過借用函數(shù)來繼承屬性,通過原型鏈的混成形式來繼承方法。
以上就是“揭秘一線互聯(lián)網(wǎng)JS高級(jí)面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)