更新時間:2019-09-12 14:10:13 來源:動力節(jié)點 瀏覽8532次
今天動力節(jié)點java培訓(xùn)機(jī)構(gòu)小編為大家分享“全新JavaScript面試題及答案”,希望通過此文,能夠幫助到即將要面試java程序員的學(xué)員,下面就隨小編一起看看全新JavaScript面試題及答案。
Number、String 、Boolean 、Null、Undefined
Object 是 JavaScript 中所有對象的父對象
數(shù)據(jù)封裝類對象:Object、Array、Boolean、Number 和 String
其他對象:Function、Arguments、Math、Date、RegExp、Error
新類型:Symbol
全稱 : Asynchronous Javascript And XML
所謂異步,就是向服務(wù)器發(fā)送請求的時候,我們不必等待結(jié)果,而是可以同時做其他的事情,等到有了結(jié)果它自己會根據(jù)設(shè)定進(jìn)行后續(xù)操作,與此同時,頁面是不會發(fā)生整頁刷新的,提高了用戶體驗。
創(chuàng)建Ajax的過程:
1)創(chuàng)建XMLHttpRequest對象(異步調(diào)用對象)
var xhr = new XMLHttpRequest();
2) 創(chuàng)建新的Http請求(方法、URL、是否異步)
xhr.open(‘get’,’example.php’,false);
3) 設(shè)置響應(yīng)HTTP請求狀態(tài)變化的函數(shù)。
onreadystatechange事件中readyState屬性等于4。響應(yīng)的HTTP狀態(tài)為200(OK)或者304(Not Modified)。
4) 發(fā)送http請求
xhr.send(data);
5) 獲取異步調(diào)用返回的數(shù)據(jù)
注意:
基本數(shù)據(jù)類型存儲在棧中,引用數(shù)據(jù)類型(對象)存儲在堆中,指針放在棧中。
兩種類型的區(qū)別是:存儲位置不同;原始數(shù)據(jù)類型直接存儲在棧中的簡單數(shù)據(jù)段,占據(jù)空間小、大小固定,屬于被頻繁使用數(shù)據(jù),所以放入棧中存儲;引用數(shù)據(jù)類型存儲在堆中的對象,占據(jù)空間大、大小不固定,如果存儲在棧中,將會影響程序運行的性能
引用數(shù)據(jù)類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當(dāng)解釋器尋找引用值時,會首先檢索其在棧中的地址,取得地址后從堆中獲得實體。
棧(stack):由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量等;
堆(heap):一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由操作系統(tǒng)釋放。
作用域鏈的原理和原型鏈很類似,如果這個變量在自己的作用域中沒有,那么它會尋找父級的,直到最頂層。
注意:JS沒有塊級作用域,若要形成塊級作用域,可通過(function(){})();立即執(zhí)行的形式實現(xiàn)。
它的功能是把對應(yīng)的字符串解析成JS代碼并運行;應(yīng)該避免使用eval,不安全,非常耗性能(2次,一次解析成js語句,一次執(zhí)行)。
window對象代表瀏覽器中打開的一個窗口。document對象代表整個html文檔。實際上,document對象是window對象的一個屬性。
null表示一個對象被定義了,但存放了空指針,轉(zhuǎn)換為數(shù)值時為0。
undefined表示聲明的變量未初始化,轉(zhuǎn)換為數(shù)值時為NAN。
typeof(null) -- object;
typeof(undefined) -- undefined
[1,NaN,NaN]
解析:
Array.prototype.map()
array.map(callback[, thisArg])
callback函數(shù)的執(zhí)行規(guī)則
參數(shù):自動傳入三個參數(shù)
currentValue(當(dāng)前被傳遞的元素);
index(當(dāng)前被傳遞的元素的索引);
array(調(diào)用map方法的數(shù)組)
parseInt方法接收兩個參數(shù)
第三個參數(shù)["1", "2", "3"]將被忽略。parseInt方法將會通過以下方式被調(diào)用
parseInt("1", 0)
parseInt("2", 1)
parseInt("3", 2)
parseInt的第二個參數(shù)radix為0時,ECMAScript5將string作為十進(jìn)制數(shù)字的字符串解析;
parseInt的第二個參數(shù)radix為1時,解析結(jié)果為NaN;
parseInt的第二個參數(shù)radix在2—36之間時,如果string參數(shù)的第一個字符(除空白以外),不屬于radix指定進(jìn)制下的字符,解析結(jié)果為NaN。
parseInt("3", 2)執(zhí)行時,由于"3"不屬于二進(jìn)制字符,解析結(jié)果為NaN。
IE為事件冒泡,F(xiàn)irefox同時支持事件捕獲和事件冒泡。但并非所有瀏覽器都支持事件捕獲。jQuery中使用event.stopPropagation()方法可阻止冒泡;(舊IE的方法 ev.cancelBubble = true;)
閉包指的是一個函數(shù)可以訪問另一個函數(shù)作用域中變量。常見的構(gòu)造方法,是在一個函數(shù)內(nèi)部定義另外一個函數(shù)。內(nèi)部函數(shù)可以引用外層的變量;外層變量不會被垃圾回收機(jī)制回收。
注意,閉包的原理是作用域鏈,所以閉包訪問的上級作用域中的變量是個對象,其值為其運算結(jié)束后的最后一個值。
優(yōu)點:避免全局變量污染。缺點:容易造成內(nèi)存泄漏。
例子:
function makeFunc() {
var name = "Mozilla";
function displayName() {
console.log(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc(); //輸出Mozilla
myFunc 變成一個 閉包。閉包是一種特殊的對象。它由兩部分構(gòu)成:函數(shù),以及創(chuàng)建該函數(shù)的環(huán)境。環(huán)境由閉包創(chuàng)建時在作用域中的任何局部變量組成。在我們的例子中,myFunc 是一個閉包,由 displayName 函數(shù)和閉包創(chuàng)建時存在的 "Mozilla" 字符串形成。
除了正常模式運行外,ECMAscript添加了第二種運行模式:“嚴(yán)格模式”。
作用:
使用instanceof 即if(a instanceof Person){alert('yes');}
Object.hasOwnProperty(proName):是用來判斷一個對象是否有你給出名稱的屬性。不過需要注意的是,此方法無法檢查該對象的原型鏈中是否具有該屬性,該屬性必須是對象本身的一個成員。
全稱:JavaScript Object Notation
JSON中對象通過“{}”來標(biāo)識,一個“{}”代表一個對象,如{“AreaId”:”123”},對象的值是鍵值對的形式(key:value)。JSON是JS的一個嚴(yán)格的子集,一種輕量級的數(shù)據(jù)交換格式,類似于xml。數(shù)據(jù)格式簡單,易于讀寫,占用帶寬小。
兩個函數(shù):
JSON.parse(str)
解析JSON字符串 把JSON字符串變成JavaScript值或?qū)ο?/p>
JSON.stringify(obj)
將一個JavaScript值(對象或者數(shù)組)轉(zhuǎn)換為一個 JSON字符串
eval('('+json+')')
用eval方法注意加括號 而且這種方式更容易被攻擊
JS的延遲加載有助與提高頁面的加載速度。
defer和async、動態(tài)創(chuàng)建DOM方式(用得最多)、按需異步載入JS
defer:延遲腳本。立即下載,但延遲執(zhí)行(延遲到整個頁面都解析完畢后再運行),按照腳本出現(xiàn)的先后順序執(zhí)行。
async:異步腳本。下載完立即執(zhí)行,但不保證按照腳本出現(xiàn)的先后順序執(zhí)行。
同步的概念在操作系統(tǒng)中:不同進(jìn)程協(xié)同完成某項工作而先后次序調(diào)整(通過阻塞、喚醒等方式),同步強(qiáng)調(diào)的是順序性,誰先誰后。異步不存在順序性。
同步:瀏覽器訪問服務(wù)器,用戶看到頁面刷新,重新發(fā)請求,等請求完,頁面刷新,新內(nèi)容出現(xiàn),用戶看到新內(nèi)容之后進(jìn)行下一步操作。
異步:瀏覽器訪問服務(wù)器請求,用戶正常操作,瀏覽器在后端進(jìn)行請求。等請求完,頁面不刷新,新內(nèi)容也會出現(xiàn),用戶看到新內(nèi)容。
若請求的資源編碼,如外引js文件編碼與頁面編碼不同。可根據(jù)外引資源編碼方式定義為 charset="utf-8"或"gbk"。
比如:http://www.yyy.com/a.html 中嵌入了一個http://www.xxx.com/test.js
a.html 的編碼是gbk或gb2312的。 而引入的js編碼為utf-8的 ,那就需要在引入的時候
模塊化開發(fā)指的是在解決某一個復(fù)雜問題或者一系列問題時,依照一種分類的思維把問題進(jìn)行系統(tǒng)性的分解。模塊化是一種將復(fù)雜系統(tǒng)分解為代碼結(jié)構(gòu)更合理,可維護(hù)性更高的可管理的模塊方式。對于軟件行業(yè):系統(tǒng)被分解為一組高內(nèi)聚,低耦合的模塊。
24. AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)規(guī)范區(qū)別?
AMD 是 RequireJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。CMD 是 SeaJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。
區(qū)別:
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此處略去 100 行
var b = require('./b') // 依賴可以就近書寫
b.doSomething()
})
// AMD 默認(rèn)推薦
define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好
a.doSomething();
// 此處略去 100 行
b.doSomething();
})
核心是js的加載模塊,通過正則匹配模塊以及模塊的依賴關(guān)系,保證文件加載的先后順序,根據(jù)文件的路徑對加載過的文件做了緩存。
call()方法和apply()方法的作用相同,動態(tài)改變某個類的某個方法的運行環(huán)境。他們的區(qū)別在于接收參數(shù)的方式不同。在使用call()方法時,傳遞給函數(shù)的參數(shù)必須逐個列舉出來。使用apply()時,傳遞給函數(shù)的是參數(shù)數(shù)組。
當(dāng)渲染樹中的一部分(或全部)因為元素的規(guī)模尺寸,布局,隱藏等改變而需要重新構(gòu)建。這就稱為回流(reflow)。每個頁面至少需要一次回流,就是在頁面第一次加載的時候。在回流的時候,瀏覽器會使渲染樹中受到影響的部分失效,并重新構(gòu)造這部分渲染樹。完成回流后,瀏覽器會重新繪制受影響的部分到屏幕中,該過程成為重繪
1)創(chuàng)建新節(jié)點
2)添加、移除、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子節(jié)點前插入一個新的子節(jié)點
3)查找
pop、push、shift、unshift、splice、reverse、sort、concat、join、slice、toString、indexOf、lastIndexOf、reduce、reduceRight
forEach、map、filter、every、some
全局變量、閉包、DOM清空或刪除時,事件未清除、子元素存在引用
通過使用多個非主要域名來請求靜態(tài)文件,如果靜態(tài)文件都放在主域名下,那靜態(tài)文件請求的時候帶有的cookie的數(shù)據(jù)提交給server是非常浪費的,還不如隔離開。因為cookie有域的限制,因此不能跨域提交請求,故使用非主要域名的時候,請求頭中就不會帶有cookie數(shù)據(jù),這樣可以降低請求頭的大小,降低請求時間,從而達(dá)到降低整體請求延時的目的。同時這種方式不會將cookie傳入server,也減少了server對cookie的處理分析環(huán)節(jié),提高了server的http請求的解析速度。
onclick鼠標(biāo)點擊某個對象;onfocus獲取焦點;onblur失去焦點;onmousedown鼠標(biāo)被按下
Flash提供了ExternalInterface接口與JavaScript通信,ExternalInterface有兩個方法,call和addCallback,call的作用是讓Flash調(diào)用js里的方法,addCallback是用來注冊flash函數(shù)讓js調(diào)用。
Flash:適合處理多媒體、矢量圖形、訪問機(jī)器。但對css、處理文本不足,不容易被搜索。
Ajax:對css、文本支持很好,但對多媒體、矢量圖形、訪問機(jī)器不足。
第一個字符必須是一個字母、下劃線(_)或一個美元符號($);其他字符可以是字母、下劃線、美元符號或數(shù)字。
漸進(jìn)增強(qiáng):針對低版本瀏覽器進(jìn)行構(gòu)建頁面,保證最基本的功能,然后再針對高級瀏覽器進(jìn)行效果、交互等改進(jìn),達(dá)到更好的用戶體驗。
優(yōu)雅降級:一開始就構(gòu)建完整的功能,然后再針對低版本瀏覽器進(jìn)行兼容。
web socket:在一個單獨的持久連接上提供全雙工、雙向的通信。使用自定義的協(xié)議(ws://、wss://),同源策略對web socket不適用。
web worker:運行在后臺的JavaScript,不影響頁面的性能。
創(chuàng)建worker:var worker = new Worker(url);
向worker發(fā)送數(shù)據(jù):worker.postMessage(data);
接收worker返回的數(shù)據(jù):worker.onmessage
終止一個worker的執(zhí)行:worker.terminate();
1) 標(biāo)記清除:
這個算法把“對象是否不再需要”簡化定義為“對象是否可以獲得”。
這個算法假定設(shè)置一個叫做根(root)的對象(在Javascript里,根是全局對象)。定期的,垃圾回收器將從根開始,找所有從根開始引用的對象,然后找這些對象引用的對象。從根開始,垃圾回收器將找到所有可以獲得的對象和所有不能獲得的對象。
2) 引用計數(shù):
這是最簡單的垃圾收集算法。此算法把“對象是否不再需要”簡化定義為“對象有沒有其他對象引用到它”。如果沒有引用指向該對象(零引用),對象將被垃圾回收機(jī)制回收。
該算法有個限制:無法處理循環(huán)引用。兩個對象被創(chuàng)建,并互相引用,形成了一個循環(huán)。它們被調(diào)用之后不會離開函數(shù)作用域,所以它們已經(jīng)沒有用了,可以被回收了。然而,引用計數(shù)算法考慮到它們互相都有至少一次引用,所以它們不會被回收。
JavaScript數(shù)據(jù)推送:commet(基于http長連接的服務(wù)器推送技術(shù))。
基于web socket的推送:SSE(server-send Event)
1) 將cookie的失效時間設(shè)置為過去的時間(expires)
document.cookie = ‘user=’+ encodeURIComponent(‘name’) + ';
expires=’+ new Date(0);
2) 將系統(tǒng)時間設(shè)置為當(dāng)前時間往前一點時間
var data = new Date();
date.setDate(date.getDate()-1);
attribute是dom元素在文檔中作為html標(biāo)簽擁有的屬性
property是dom元素在js中作為對象擁有的屬性。
所以,對于html的標(biāo)準(zhǔn)屬性來說,attribute和property是同步的,是會自動更新的。但對于自定義屬性,他們不同步。
1)通過location.hash記錄狀態(tài),讓瀏覽器記錄Ajax請求時頁面狀態(tài)的變化。
2)通過HTML5的history.pushstate,來實現(xiàn)瀏覽器地址欄的無刷新改變。
以上就是動力節(jié)點java培訓(xùn)機(jī)構(gòu)小編分享的“最新最全的JavaScript面試題及答案”的內(nèi)容,希望對大家有幫助,更多java面試題請繼續(xù)關(guān)注動力節(jié)點java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會有精彩內(nèi)容分享與你。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743