【前端面試題】03—200+道常見JavaScript基礎(chǔ)面試題上(附答案)

1、JavaScript有哪些垃圾回收機(jī)制?
有以下垃圾回收機(jī)制。
標(biāo)記清除( mark and sweep)
這是 JavaScript最常見的垃圾回收方式。當(dāng)變量進(jìn)入執(zhí)行環(huán)境的時(shí)候,比如在函數(shù)中聲明一個(gè)變量,垃圾回收器將其標(biāo)記為“進(jìn)入環(huán)境”。當(dāng)變量離開環(huán)境的時(shí)候(函數(shù)執(zhí)行結(jié)束),將其標(biāo)記為“離開環(huán)境”。
垃圾回收器會(huì)在運(yùn)行的時(shí)候給存儲(chǔ)在內(nèi)存中的所有變量加上標(biāo)記,然后去掉環(huán)境中的變量,以及被環(huán)境中變量所引用的變量(閉包)的標(biāo)記。在完成這些之后仍然存在的標(biāo)記就是要?jiǎng)h除的變量。
引用計(jì)數(shù)( reference counting)
在低版本的E中經(jīng)常會(huì)發(fā)生內(nèi)存泄漏,很多時(shí)候就是因?yàn)樗捎靡糜?jì)數(shù)的方式進(jìn)行垃圾回收。引用計(jì)數(shù)的策略是跟蹤記錄每個(gè)值被使用的次數(shù)。
當(dāng)聲明了一個(gè)變量并將個(gè)引用類型賦值給該變量的時(shí)候,這個(gè)值的引用次數(shù)就加1.如果該變量的值變成了另外一個(gè),則這個(gè)值的引用次數(shù)減1.當(dāng)這個(gè)值的引用次數(shù)變?yōu)?的時(shí)候,說明沒有變量在使用,這個(gè)值沒法被訪問。
因此,可以將它占用的空間回收,這樣垃圾回收器會(huì)在運(yùn)行的時(shí)候清理引用次數(shù)為0的值占用的空間在正中雖然 JavaScript對(duì)象通過標(biāo)記清除的方式進(jìn)行垃圾回收,但是BOM與DOM對(duì)象是用引用計(jì)數(shù)的方式回收垃圾的。
也就是說,只要涉及BOM和DOM,就會(huì)出現(xiàn)循環(huán)引用問題
2、列舉幾種類型的DOM節(jié)點(diǎn)
有以下幾類DOM節(jié)點(diǎn)。
整個(gè)文檔是一個(gè)文檔( Document)節(jié)點(diǎn)。
每個(gè)HTML標(biāo)簽是一個(gè)元素( Element)節(jié)點(diǎn)。
每一個(gè)HTML屬性是一個(gè)屬性( Attribute)節(jié)點(diǎn)。
包含在HTML元素中的文本是文本(Text)節(jié)點(diǎn)。
3、談?wù)?script標(biāo)簽中 defer和 async屬性的區(qū)別。
區(qū)別如下。
(1) defer屬性規(guī)定是否延遲執(zhí)行腳本,直到頁面加載為止, async屬性規(guī)定腳本一旦可用,就異步執(zhí)行。
(2) defer并行加載 JavaScript文件,會(huì)按照頁面上 script標(biāo)簽的順序執(zhí)行, async并行加載 JavaScript文件,下載完成立即執(zhí)行,不會(huì)按照頁面上 script標(biāo)簽的順序執(zhí)行。
4、說說你對(duì)閉包的理解。
使用閉包主要是為了設(shè)計(jì)私有的方法和變量。閉包的優(yōu)點(diǎn)是可以避免全局變量的污染;缺點(diǎn)是閉包會(huì)常駐內(nèi)存,增加內(nèi)存使用量,使用不當(dāng)很容易造成內(nèi)存泄漏。在JavaScript中,函數(shù)即閉包,只有函數(shù)才會(huì)產(chǎn)生作用域閉包有3個(gè)特性
(1)函數(shù)嵌套函數(shù)。
(2)在函數(shù)內(nèi)部可以引用外部的參數(shù)和變量
(3)參數(shù)和變量不會(huì)以垃圾回收機(jī)制回收
5、解釋一下 unshift0方法。
該方法在數(shù)組啟動(dòng)時(shí)起作用,與 push()不同。它將參數(shù)成員添加到數(shù)組的頂部下面給出一段示例代。
var name=["john"]name. unshift("charlie");name.unshift("joseph","Jane");console. log(name);
輸出如下所示。
[" joseph ", Jane "," charlie "," john "]6、encodeR0和 decodeR0的作用是什么?
encodeURI()用于將URL轉(zhuǎn)換為十六進(jìn)制編碼。而 decodeURI()用于將編碼的URL轉(zhuǎn)換回正常URL。
7、為什么不建議在 JavaScript中使用 innerHTML?
通過 innerHTML修改內(nèi)容,每次都會(huì)刷新,因此很慢。在 innerHTML中沒有驗(yàn)證的機(jī)會(huì),因此更容易在文檔中插入錯(cuò)誤代碼,使網(wǎng)頁不穩(wěn)定。
8、如何在不支持 JavaScript的舊瀏覽器中隱藏 JavaScript代碼?
在< script>標(biāo)簽之后的代碼中添加“<!--”,不帶引號(hào)。
在< /script>標(biāo)簽之前添加“//-->”,代碼中沒有引號(hào)。
舊瀏覽器現(xiàn)在將 JavaScript代碼視為一個(gè)長(zhǎng)的HTML注釋,而支持 JavaScript的瀏覽器則將"<!-"和"http://-->"作為一行注釋。
9、在DOM操作中怎樣創(chuàng)建、添加、移除、替換、插入和查找節(jié)點(diǎn)?
具體方法如下。
(1)通過以下代碼創(chuàng)建新節(jié)點(diǎn)。
createDocument Fragment ()//創(chuàng)建一個(gè)D0M片段createElement ()//創(chuàng)建一個(gè)具體的元素createTextNode ()//創(chuàng)建一個(gè)文本節(jié)點(diǎn)
(2)通過以下代碼添加、移除、替換、插入節(jié)點(diǎn)
appendchild()removechild()eplacechild ()insertBefore ()//并沒有 insertAfter()(3)通過以下代碼查找節(jié)點(diǎn)。getElementsByTagName ()//通過標(biāo)簽名稱查找節(jié)點(diǎn)getElementsByName ()//通過元素的name屬性的值查找節(jié)點(diǎn)(IE容錯(cuò)能力較強(qiáng),會(huì)得到一個(gè)數(shù)//組,其中包括id等于name值的節(jié)點(diǎn))getElementById(//通過元素Id查找節(jié)點(diǎn),具有唯一性
10、如何實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁之間的通信?
調(diào)用 localstorge、 cookie等數(shù)據(jù)存儲(chǔ)通信方式
11、null和 undefined的區(qū)別是什么?
null是一個(gè)表示“無”的對(duì)象,轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示“無”的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN。
當(dāng)聲明的變量還未初始化時(shí),變量的默認(rèn)值為 undefined 。
null用來表示尚未存在的對(duì)象,常用來表示函數(shù)企圖返回一個(gè)不存在的對(duì)象。
undefined表示“缺少值”,即此處應(yīng)該有一個(gè)值,但是還沒有定義,典型用法是如下。
(1)如果變量聲明了,但沒有賦值,它就等于 undefined
(2)當(dāng)調(diào)用函數(shù)時(shí),如果沒有提供應(yīng)該提供的參數(shù),該參數(shù)就等于 undefined。
(3)如果對(duì)象沒有賦值,該屬性的值為 undefined。
(4)當(dāng)函數(shù)沒有返回值時(shí),默認(rèn)返回 undefined。
null表示“沒有對(duì)象”,即此處不應(yīng)該有值,典型用法是如下。
(1)作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象。
(2)作為對(duì)象原型鏈的終點(diǎn)。
12、new操作符的作用是什么?
作用如下:
(1)創(chuàng)建一個(gè)空對(duì)象。
(2)由this變量引用該對(duì)象
(3)該對(duì)象繼承該函數(shù)的原型(更改原型鏈的指向)
(4)把屬性和方法加入到this引用的對(duì)象中。
(5)新創(chuàng)建的對(duì)象由this引用,最后隱式地返回this,過程如下:
var obj ={};obj._ _ proto_ _ Base .prototype;Base .call(obj);
13、JavaScript延遲加載的方式有哪些?
包括 defer和 async、動(dòng)態(tài)創(chuàng)建DOM(創(chuàng)建 script,插入DOM中,加載完畢后回調(diào)、按需異步載入 JavaScript。
14、call()和apply()的區(qū)別和作用是什么?
作用都是在函數(shù)執(zhí)行的時(shí)候,動(dòng)態(tài)改變函數(shù)的運(yùn)行環(huán)境(執(zhí)行上下文)。
call和 apply的第一個(gè)參數(shù)都是改變運(yùn)行環(huán)境的對(duì)象。
區(qū)別如下。
call從第二個(gè)參數(shù)開始,每一個(gè)參數(shù)會(huì)依次傳遞給調(diào)用函數(shù);apply的第二個(gè)參數(shù)是數(shù)組,數(shù)組的每一個(gè)成員會(huì)依次傳遞給調(diào)用函數(shù)。
如
func, call(funcl, varl, var2, var3)對(duì)應(yīng)的 apply寫法為:
func. apply (funcl, [varl, var2, var3])15、哪些操作會(huì)造成內(nèi)存泄漏?
內(nèi)存泄漏指不再擁有或需要任何對(duì)象(數(shù)據(jù))之后,它們?nèi)匀淮嬖谟趦?nèi)存中。
提示:垃圾回收器定期掃描對(duì)象,并計(jì)算引用了每個(gè)對(duì)象的其他對(duì)象的數(shù)量。如果一個(gè)對(duì)象的引用數(shù)量為0(沒有其他對(duì)象引用過該對(duì)象),或?qū)υ搶?duì)象的唯一引用是循環(huán)的,那么該對(duì)象占用的內(nèi)存立即被回收。
如果 setTimeout的第一個(gè)參數(shù)使用字符串而非函數(shù),會(huì)引發(fā)內(nèi)存泄漏閉包、控制臺(tái)日志、循環(huán)(在兩個(gè)對(duì)象彼此引用且彼此保留時(shí),就會(huì)產(chǎn)生一個(gè)循環(huán))等會(huì)造內(nèi)存泄漏。
16、列舉E與 firefox的不同之處。
不同之處如下
(1)IE支持 currentStyle;Firefox使用 get ComputStyle。
(2)IE使用 inner Text;Firefox使用 textContent。
(3)在透明度濾鏡方面,正使用 filter:alpha( opacity=num);Firefox使用-moz- opacity :num
(4)在事件方面,IE使用 attachEvent:Firefox使用 add Event Listener
(5)對(duì)于鼠標(biāo)位置:IE使用 event. clientX;Firefox使用 event. pageX。
(6)IE使用 event. srcElement;Firefox使用 event. target
(7)要消除list的原點(diǎn),IE中僅須使 margin:0即可達(dá)到最終效果;Firefox中需要設(shè)置margin:0、 padding:0和 list-style:none
(8)CSS圓角:IE7以下不支持圓角。
17、講解一下 JavaScript對(duì)象的幾種創(chuàng)建方式。
有以下創(chuàng)建方式:
(1) Object構(gòu)造函數(shù)式。
(2)對(duì)象字面量式。
(3)工廠模式。
(4)安全工廠模式。
(5)構(gòu)造函數(shù)模式。
(6)原型模式。
(7)混合構(gòu)造函數(shù)和原型模式。
(8)動(dòng)態(tài)原型模式。
(9)寄生構(gòu)造函數(shù)模式。
(10)穩(wěn)妥構(gòu)造函數(shù)模式。
18、如何實(shí)現(xiàn)異步編程?
具體方法如下:
方法1,通過回調(diào)函數(shù)。優(yōu)點(diǎn)是簡(jiǎn)單、容易理解和部署;缺點(diǎn)是不利于代碼的閱讀和維護(hù),各個(gè)部分之間高度耦合( Coupling),流程混亂,而且每個(gè)任務(wù)只能指定一個(gè)回調(diào)函數(shù)。
方法2,通過事件監(jiān)聽,可以綁定多個(gè)事件,每個(gè)事件可以指定多個(gè)回調(diào)函數(shù),而且可以“去耦合”( Decoupling),有利于實(shí)現(xiàn)模塊化;缺點(diǎn)是整個(gè)程序都要變成事件驅(qū)動(dòng)型,運(yùn)行流程會(huì)變得很不清晰。
方法3,采用發(fā)布/訂閱方式。性質(zhì)與“事件監(jiān)聽”類似,但是明顯優(yōu)于后者。
方法4,通過 Promise對(duì)象實(shí)現(xiàn), Promise對(duì)象是 Commonjs工作組提出的一種規(guī)范,旨在為異步編程提供統(tǒng)一接口。它的思想是,每一個(gè)異步任務(wù)返回一個(gè) Promise對(duì)象,該對(duì)象有一個(gè)then方法,允許指定回調(diào)函數(shù)。
19、請(qǐng)解釋一下 JavaScript的同源策略。
同源策略是客戶端腳本(尤其是 JavaScript)的重要安全度量標(biāo)準(zhǔn)。它最早出自Netscape Navigator2.0,目的是防止某個(gè)文檔或腳本從多個(gè)不同源裝載。
這里的同源策略指的是協(xié)議、域名、端口相同。同源策略是一種安全協(xié)議。指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。
20、為什么要有同源限制?
我們舉例說明。比如一個(gè)黑客,他利用 Iframe把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實(shí)的用戶名、密碼登錄時(shí),他的頁面就可以通過 Javascript讀取到你表單上 Input中的內(nèi)容,這樣黑客就會(huì)輕松得到你的用戶名和密碼。
21、在 JavaScript中,為什么說函數(shù)是第一類對(duì)象?
第一類函數(shù)即 JavaScript中的函數(shù)。這通常意味著這些函數(shù)可以作為參數(shù)傳遞給其他函數(shù),作為其他函數(shù)的值返回,分配給變量,也可以存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)中。
22、什么是事件?E與 Firefox的事件機(jī)制有什么區(qū)別?如何阻止冒泡?
事件是在網(wǎng)頁中的某個(gè)操作(有的操作對(duì)應(yīng)多個(gè)事件)例如,當(dāng)單擊一個(gè)按鈕時(shí),就會(huì)產(chǎn)生一個(gè)事件,它可以被 JavaScript偵測(cè)到,在事件處理機(jī)制上,正E支持事件冒泡;Firefox同時(shí)支持兩種事件模型,也就是捕獲型事件和冒泡型事件。
阻止方法是 ev.stop Propagation.注意舊版E中的方法 ev. cancelBubble=true.
23、函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別?
在 JavaScript中,在向執(zhí)行環(huán)境中加載數(shù)據(jù)時(shí),解析器對(duì)函數(shù)聲明和函數(shù)表達(dá)式并非是一視同仁的。解析器會(huì)首先讀取函數(shù)聲明,并使它在執(zhí)行任何代碼之前可用(可以訪問)。至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行,才會(huì)真正解析和執(zhí)行它。
24、如何刪除一個(gè) cookie?
為了刪除 cookie,要修改 expires,代碼如下。
document. cookie ='user=icketang;expires ='+ new Date(0)
25、編寫一個(gè)方法,求一個(gè)字符串的長(zhǎng)度(單位是字節(jié))
假設(shè)一個(gè)英文字符占用一字節(jié),一個(gè)中文字符占用兩字節(jié):
function GetBytes(str){var len=str .length;var bytes= len;for(var i-0:i<len;1++){if (str. charcodeAt (i)>255) bytes++;}return bytes;}alert( GetBytes("hello 有課前端網(wǎng)!"));
26、對(duì)于元素, attribute和 property的區(qū)別是什么?
attribute是DOM元素在文檔中作為HTML標(biāo)簽擁有的屬性;property就是DOM元素在 JavaScript中作為對(duì)象擁有的屬性。
對(duì)于HTML的標(biāo)準(zhǔn)屬性來說, attribute和 property是同步的,會(huì)自動(dòng)更新,但是對(duì)于自定義的屬性來說,它們是不同步的。
27、解釋延遲腳本在 JavaScript中的作用。
默認(rèn)情況下,在頁面加載期間,HTML代碼的解析將暫停,直到腳本停止執(zhí)行。
這意味著,如果服務(wù)器速度較慢或者腳本特別“沉重”,則會(huì)導(dǎo)致網(wǎng)頁延遲。在使用Deferred時(shí),腳本會(huì)延遲執(zhí)行,直到HTML解析器運(yùn)行。這縮短了網(wǎng)頁的加載時(shí)間,并且它們的顯示速度更快。
28、什么是閉包( closure)?
為了說明閉包,創(chuàng)建一個(gè)閉包。
function hello(){//函數(shù)執(zhí)行完畢,變量仍然存在var num= 100;var showResult= function(){ alert (num);}num++;return showResult ;}var showResult= he1lo();showResult()//執(zhí)行結(jié)果:彈出101
執(zhí)行 hello()后, hello()閉包內(nèi)部的變量會(huì)存在,而閉包內(nèi)部函數(shù)的內(nèi)部變量不會(huì)存在,使得 JavaScript的垃圾回收機(jī)制不會(huì)收回hello()占用的資源,因?yàn)閔ell()中內(nèi)部函數(shù)的執(zhí)行需要依賴 hello()中的變量。
29、如何判斷一個(gè)對(duì)象是否屬于某個(gè)類?
使用 instanceof關(guān)鍵字,判斷一個(gè)對(duì)象是否是類的實(shí)例化對(duì)象;使用 constructor屬性,判斷一個(gè)對(duì)象是否是類的構(gòu)造函數(shù)。
30、JavaScript中如何使用事件處理程序?
事件是由用戶與頁面的交互(例如單擊鏈接或填寫表單)導(dǎo)致的操作。需要個(gè)事件處理程序來保證所有事件的正確執(zhí)行。事件處理程序是對(duì)象的額外屬性。此屬性包括事件的名稱和事件發(fā)生時(shí)采取的操作。
31、在 JavaScript中有一個(gè)函數(shù),執(zhí)行直接對(duì)象查找時(shí),它始終不會(huì)查找原型,這個(gè)函數(shù)是什么?
hasOwnProperty。
32、在 JavaScript中如何使用DOM?
DOM代表文檔對(duì)象模型,并且負(fù)責(zé)文檔中各種對(duì)象的相互交互。DOM是開發(fā)網(wǎng)頁所必需的,其中包括諸如段落、鏈接等對(duì)象??梢圆僮鬟@些對(duì)象,如添加或刪除等。為此,DOM還需要向網(wǎng)頁添加額外的功能。
33、documen.wrte和 innerHTML的區(qū)別是什么?
document.wite重繪整個(gè)頁面;innerHTML可以重繪頁面的一部分。
34、在 JavaScript中讀取文件的方法是什么?
可以通過如下方式讀取服務(wù)器中的文件內(nèi)容。
function readAjaxEile(url) {//創(chuàng)建xhrvar xhr =new XMLHttpRequest();/監(jiān)聽狀態(tài)xhr. onreadystatechange=function(){//監(jiān)聽狀態(tài)值是4if(xhr. readystate == 4 && xhr. status = = =200){console. log(xhr. responseText)}//打開請(qǐng)求xhr.open('GET', url, true)//發(fā)送數(shù)據(jù)xhr, send(null)}
可以通過如下方式讀取本地計(jì)算機(jī)中的內(nèi)容。
function readInputFile(id) {var file= document. getElementById(id). files[0];//實(shí)例化 FileReadervar reader=new FileReader();//讀取文件reader. readAsText (file)//監(jiān)聽返回reader, onload= function (data) {console. log (data, this .result)}}
35、如何分配對(duì)象屬性?
將屬性分配給對(duì)象的方式與賦值給變量的方式相同。例如,表單對(duì)象的操作值以下列方式分配給" submit":document.form. action=" submit'"
36、請(qǐng)說幾條書寫 JavaScript語句的基本規(guī)范。
基本規(guī)范如下:
(1)不要在同一行聲明多個(gè)變量。
(2)應(yīng)使用==/!==來比較true/ false或者數(shù)值。
(3)使用對(duì)象字面量替代 new Array這種形式。
(4)不要使用全局函數(shù)。
(5) switch語句必須帶有 default分支。
(6)函數(shù)不應(yīng)該有時(shí)有返回值,有時(shí)沒有返回值。
(7)for循環(huán)必須使用大括號(hào)括起來。
(8)if語句必須使用大括號(hào)括起來。
9)for-in循環(huán)中的變量應(yīng)該使用war關(guān)鍵字明確限定的作用域,從而避免作用域污染。
37、eva的功能是什么?
它的功能是把對(duì)應(yīng)的字符串解析成 Javascript代碼并運(yùn)行應(yīng)該避免使用eval,它會(huì)造成程序不安全,非常影響性能(執(zhí)行兩次,一次解析成JavaScript語句,一次執(zhí)行)
38、["1,"2,"3"].map( parselnt)的執(zhí)行結(jié)果是多少?
[1,NaN,NaN],因?yàn)?parseInt需要兩個(gè)參數(shù)(val, radix),其中 radix表示解析時(shí)用的基數(shù)(進(jìn)制);map傳遞了3個(gè)參數(shù)(item, index,aray),對(duì)應(yīng)的radix不合法導(dǎo)致解析失敗。
39、談?wù)勀銓?duì)this對(duì)象的理解。
this是 JavaScript的一個(gè)關(guān)鍵字,隨著函數(shù)使用場(chǎng)合的不同,this的值會(huì)發(fā)生變化。但是有一個(gè)總原則,即this指的是調(diào)用函數(shù)的那個(gè)對(duì)象一般情況下,this是全局對(duì)象 Global,可以作為方法調(diào)用
40、Web- garden和web-farm有什么不同?
web-garden和 web-farm都是網(wǎng)絡(luò)托管系統(tǒng)。唯一的區(qū)別是 web-garden是在單個(gè)服務(wù)器中包含許多處理器的設(shè)置,而web-farm是使用多個(gè)服務(wù)器的較大設(shè)置。
41、說一下 document. write0的用法。
document. write()方法可以用在兩個(gè)地方,頁面載入過程中用實(shí)時(shí)腳本創(chuàng)建頁面內(nèi)容,以及用延時(shí)腳本創(chuàng)建本窗口或新窗口的內(nèi)容document. write只能重繪整個(gè)頁面, innerHTML可以重繪頁面的一部分。
42、在 JavaScript中什么是類(偽)數(shù)組?如何將類(偽)數(shù)組轉(zhuǎn)化為標(biāo)準(zhǔn)數(shù)組?
典型的類(偽)數(shù)組是函數(shù)的 argument參數(shù),在調(diào)用 getElements By TagName和 document .childNodes方法時(shí),它們返回的 NodeList對(duì)象都屬于偽數(shù)組??梢允褂肁rray .prototype. slice. call( fake Array)將數(shù)組轉(zhuǎn)化為真正的Aray對(duì)象。
43、JavaScript中callee和 caller的作用是什么?
caller返回一個(gè)關(guān)于函數(shù)的引用,該函數(shù)調(diào)用了當(dāng)前函數(shù);callee返回正在執(zhí)行的函數(shù),也就是指定的 function對(duì)象的正文。
44、講一下手寫數(shù)組快速排序的步驟。
"快速排序”的思想很簡(jiǎn)單,整個(gè)排序過程只需要3步
(1)在數(shù)據(jù)集之中,選擇一個(gè)元素作為“基準(zhǔn)”( pivot)。
(2)將所有小于“基準(zhǔn)”的元素,都移到“基準(zhǔn)”的左邊;將所有大于“基準(zhǔn)”的元素,都移到“基準(zhǔn)”的右邊。
(3)對(duì)“基準(zhǔn)”左邊和右邊的兩個(gè)子集,不斷重復(fù)第(1)步和第(2)步,直到所有子集只剩下一個(gè)元素為止。
45、如何統(tǒng)計(jì)字符串“ aaaabbbccccddfgh”中字母的個(gè)數(shù)或統(tǒng)計(jì)最多的字母數(shù)?
具體代碼如下
var str =aaaabbbecccddfgh";function dealstr(str){var obj={};for (var i= 0;i< str length:i++){var v=str.charAt (i);if (obj[v] && obj [v].value === v){++obj[v]. count} else {obj[v] ={count:1,va⊥ue:v}}}return obj ;}var obj= dealstr(str);for (key in obj){console. log (obj[key] .value +'=' obj[ key].count)}
46、寫一個(gè) function,清除字符串前后的空格(兼容所有瀏覽器)。
具體代碼如下
function trim(str){if (str && typeof str === "string"){return str.replace(/^\s+1\s+$/g,"");//去除前后空白符。
47、列出不同瀏覽器中關(guān)于 JavaScript兼容性的兩個(gè)常見問題。
(1)事件綁定兼容性問題。
IE8以下的瀏覽器不支持用 add Event Listener來綁定事件,使用 attachement可以解決這個(gè)問題
(2) stopPropagation兼容性問題
IE8以下的瀏覽器不支持用 e .stopPropagation()來阻止事件傳播,使用 e .return Value =false可以解決這個(gè)問題。
48、閉包的優(yōu)缺點(diǎn)是什么?
優(yōu)點(diǎn)是不產(chǎn)生全局變量,實(shí)現(xiàn)屬性私有化缺點(diǎn)是閉包中的數(shù)據(jù)會(huì)常駐內(nèi)存,在不用的時(shí)候需要?jiǎng)h除,否則會(huì)導(dǎo)致內(nèi)存溢出(內(nèi)存泄漏)。
49、用 JavaScript實(shí)現(xiàn)一個(gè)數(shù)組合并的方法(要求去重)。
代碼如下。
var arrl =['a'];var arr2 =['b', 'c'];var arr3=['c', ['d'], 'e', undefined, null];var concat =( function() {//去重合并arr1和arr2var _concat =function (arrl, arr2)for (var i =0, len= arr2.length; i< len; i++){~ arrl. indexOf (arr2[i])|| arrl. push(arr2[i])}}//返回?cái)?shù)組去重合并方法return function(){var result =[];for (var i=0, len= arguments .length;i< len:i++){_concat (result, arguments [i])return result}})()
執(zhí)行concat(arrl,ar2,ar3)后,會(huì)返回['a',null, undefined,'e',['d],'c','b']。
50、說明正則表達(dá)式給所有string對(duì)象添加去除首尾空白符的方法(trim方法)。
代碼如下。
prototype. trim= function(){return this .replace(/^\s+I\s+$/g," );};
51、說明用 JavaScript實(shí)現(xiàn)一個(gè)提取電話號(hào)碼的方法。
代碼如下
var str="12345678901 021-12345678 有課前端網(wǎng) 0418-1234567 13112345678";var reg=/(1\d{0})|(0\d{2,3}\-\d{7,8})/g;alert(str.match(reg);
測(cè)試“12345678901 021-12345678有課前端網(wǎng)0418-1234567 13112345678”,得到的結(jié)果應(yīng)該是:[12345678901,021-12345678,0418-1234567,13112345678]
52、JavaScript中常用的邏輯運(yùn)算符有哪些?
"and”(&&)運(yùn)算符、“or”(‖)運(yùn)算符和"not"(!)運(yùn)算符,它們可以在 JavaScript中使用。
53、什么是事件代理(事件委托)?
事件代理( Event Delegation),又稱為事件委托,是 JavaScript中綁定事件的常用技巧。顧名思義,“事件代理”就是把原本需要綁定的事件委托給父元素,讓父元素負(fù)責(zé)事件監(jiān)聽。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好處是可以提高性能。
54、什么是 JavaScript?
JavaScript是客戶端和服務(wù)器端的腳本語言,可以插入HTML頁面中,并且是目前較熱門的Web開發(fā)語言,同時(shí), JavaScript也是面向?qū)ο蟮木幊陶Z言。
55、列舉Java和 JavaScript的不同之處。
Java是一門十分完整、成熟的編程語言。相比之下, JavaScript是一個(gè)可以被引入HTML頁面的編程語言。這兩種語言并不完全相互依賴,而是針對(duì)不同的意圖而設(shè)計(jì)的。Java是一種面向?qū)ο缶幊蹋∣OP)或結(jié)構(gòu)化編程語言,類似的語言有C++;而 JavaScript是客戶端腳本語言,它稱為非結(jié)構(gòu)化編程。
56、JavaScript和ASP腳本相比,哪個(gè)更快?
JavaScript更快。JavaScript是一種客戶端語言,因此它不需要Web服務(wù)器的協(xié)助就可以執(zhí)行;ASP是服務(wù)器端語言,因此它總是比 JavaScript慢,值得注意的是, JavaScript現(xiàn)在也可用于服務(wù)器端語言( Node. js)
57、什么是負(fù)無窮大?
Infinity代表了超出 JavaScript處理范圍的數(shù)值。也就是說, JavaScript無法處理的數(shù)值都是 Infinity.實(shí)踐證明, JavaScript所能處理的最大值( Number. MAX VALUE)是17976931348623157e+308,超過該數(shù)則為正無窮大;而最小值( Number. MIN VALUE)
是5e-324,小于該數(shù)則為0.所以負(fù)無窮大代表的是小于- Number MAX VALUE的數(shù)字, JavaScript中對(duì)應(yīng)靜態(tài)變量 Number NEGATIVE INFINITY
58、如何將 JavaScript代碼分解成幾行?
M:在字符串語句中可以通過在第一行末尾使用反斜杠“\”來完成,例如, document. write("This is \a program")。
如果不是在字符串語句中更改為新行,那么 JavaScript會(huì)忽略行中的斷點(diǎn)下面的代碼是完美的,但并不建議這樣做,因?yàn)樽璧K了調(diào)試。
var x=l, y=2,z=X+y;
59、什么是未聲明和未定義的變量?
未聲明的變量是程序中不存在且未聲明的變量。如果程序嘗試讀取未聲明變量的值,則會(huì)在運(yùn)行時(shí)遇到錯(cuò)誤。未定義的變量是在程序中聲明但尚未給出任何值的變量如果程序嘗試讀取未定義變量的值,則返回未定義的值60.:如何編寫可動(dòng)態(tài)添加新元素的代碼?
下面給出一段示例代碼
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><tit1e>有課前端網(wǎng)—專業(yè)前端技術(shù)學(xué)習(xí)網(wǎng)</tit1e></head><body><p id="ickt">ickt</p><script type="text/javascript">function addNode (){var p= document. createElement('p');var textNode document, createTextNode('有課前端網(wǎng)')p .appendchild(textNode);document. getElementById('ickt') .appendChild(p)}addNode ()</script></body></html>
61、什么是全局變量?這些變量如何聲明?使用全局變量有哪些問題?
全局變量是整個(gè)代碼中都可用的變量,也就是說,這些變量沒有任何作用域var關(guān)鍵字用于聲明局部變量,如果省略var關(guān)鍵字,則聲明一個(gè)全局變量使用全局變量面臨的問題是局部變量和全局變量名稱的沖突。此外,很難調(diào)試和測(cè)試依賴于全局變量的代碼。
62、解釋 JavaScript中定時(shí)器的工作,并說明使用定時(shí)器的缺點(diǎn)。
定時(shí)器用于在設(shè)定的時(shí)間執(zhí)行一段代碼,或者在給定的時(shí)間間隔內(nèi)重復(fù)該代碼這通過使用函數(shù) setTimeout、setInterval和 clearInterva來完成。
setTimeout( function, delay)函數(shù)用于啟動(dòng)在所屬延遲之后調(diào)用特定功能的定時(shí)器。
setInterval( function,dlay)函數(shù)用于在提到的延遲中重復(fù)執(zhí)行給定的功能,只有在取消時(shí)才停止。
clearInterval(id)函數(shù)指示定時(shí)器停止定時(shí)器在一個(gè)線程內(nèi)運(yùn)行,因此事件可能需要排隊(duì)等待執(zhí)行。
63、ViewState和 SessionState有什么區(qū)別?
View State特定于會(huì)話中的頁面; SessionState特定于可在Web應(yīng)用程序中的所有頁面上訪問的用戶特定數(shù)據(jù)。
64、什么是===運(yùn)算符?
===稱為嚴(yán)格等式運(yùn)算符,當(dāng)兩個(gè)操作數(shù)具有相同的值和類型時(shí),該運(yùn)算符返回true。
65、說明如何使用 JavaScript提交表單。
要使用 JavaScript提交表單,可以使用以下代碼。
document .form [0] .submit();
66、元素的樣式/類如何改變?
可以通過以下方式改變?cè)氐臉邮健?/span>
document. getElementById("myText").style. fontsize ="20";可以通過以下方式改變?cè)氐念悺?/span>
document. getElementById("myText ").className ="anyclass";67、JavaScript中的循環(huán)結(jié)構(gòu)都有哪些?
for、 while、do.… while、 for in、 for of(ES6新增的)
68、如何在 JavaScript中將base字符串轉(zhuǎn)換為 integer?
parselnt()函數(shù)解析一個(gè)字符串參數(shù),并返回一個(gè)指定基數(shù)的整數(shù)。 parselnt()將要轉(zhuǎn)換的字符串作為其第一個(gè)參數(shù),第二個(gè)參數(shù)是給定字符串的轉(zhuǎn)換進(jìn)制基數(shù)。
為了將4F(基數(shù)16)轉(zhuǎn)換為整數(shù),可以使用代碼 parrent("4F",16)。
69、說明“==”和“===”的區(qū)別。
“==”僅檢查值相等性,而“===”用于更嚴(yán)格的等式判定。如果兩個(gè)變量的值或類型不同,則后者返回 false。
70、3+2+“7”的結(jié)果是什么?
由于3和2是整數(shù),它們將直接相加,同時(shí)由于“7”是一個(gè)字符串,將會(huì)被直連接,因此結(jié)果將是57。
71、如何檢測(cè)客戶端機(jī)器上的操作系統(tǒng)?
為了檢測(cè)客戶端機(jī)器上的操作系統(tǒng),應(yīng)使用 navigator.app Version字符串(屬性)。
72、JavaScript中的null表示什么?
null用于表示無值或無對(duì)象。它意味著沒有對(duì)象或空字符串,沒有有效的布爾沒有數(shù)值和數(shù)組對(duì)象
73、delete操作符的功能是什么?
delete操作符用于刪除對(duì)象中的某個(gè)屬性,但不能刪除變量、函數(shù)等。
74、JavaScript中有哪些類型的彈出框?
ua; alert、 confirm和 prompt。
75、void(0)的作用是什么?
void操作符使表達(dá)式的運(yùn)算結(jié)果返回 undefined。
void(0)用于防止頁面刷新,并在調(diào)用時(shí)傳遞參數(shù)“0”。
void(0)用于調(diào)用另一種方法而不刷新頁面。
76、如何強(qiáng)制頁面加載 JavaScript中的其他頁面?
必須插入以下代碼才能達(dá)到預(yù)期效果。
<script language="JavaScript" type="text/javascript"><!--location.href="http://newhost/newpath/newfile.html";//--></script>
77、轉(zhuǎn)義字符是用來做什么的?
當(dāng)使用特殊字符(如單引號(hào)、雙引號(hào)、撇號(hào)和&符號(hào))時(shí),將使用轉(zhuǎn)義字符(反斜杠)。在字符前放置反斜杠,使其顯示。
下面給出兩個(gè)示例。
document. write"I m a "good"boy "document. write"I m a\"good\"boy"
78、什么是 JavaScript cookie?
cookie是存儲(chǔ)在訪問者計(jì)算機(jī)中的變量。每當(dāng)一臺(tái)計(jì)算機(jī)通過瀏覽器請(qǐng)求某個(gè)頁面時(shí),就會(huì)發(fā)送這個(gè) cookie??梢允褂?JavaScript來創(chuàng)建和獲取 cookie的值。
79、解釋 JavaScript中的pop()方法。
pop()方法與shift()方法類似,但不同之處在于shift()方法在數(shù)組的開頭工作。此外,pop()方法將最后一個(gè)元素從給定的數(shù)組中取出并返回,然后改變被調(diào)用的數(shù)組例如:
var colors = ["red","blue","green"];colors. pop ();// colors :["red","blue"]
(4)整個(gè) innerHTML內(nèi)容被重新解析并構(gòu)建成元素,因此它的速度要慢得多。
(5) innerHTML不提供驗(yàn)證,因此可能會(huì)在文檔中插入具有破壞性的HTML并將其中斷。
81、break和 continue語句的作用是什么?
break語句從當(dāng)前循環(huán)中退出; continue語句繼續(xù)下一個(gè)循環(huán)語句。
82、在 JavaScript中, datatypes的兩個(gè)基本組是什么?
兩個(gè)基本組是原始類型和引用類型。
原始類型包括數(shù)字和布爾類型。引用類型包括更復(fù)雜的類型,如字符串和日期。
83、如何創(chuàng)建通用對(duì)象?
通用對(duì)象可以通過以下代碼創(chuàng)建。
var o= new Object ()。
84、typeof是用來做什么的?
typeof是一個(gè)運(yùn)算符,用于返回變量類型的字符串描述。
85、哪些關(guān)鍵字用于處理異常?
try...catch...finally用于處理 JavaScript中的異常。try{執(zhí)行代碼}catch(exp){拋出錯(cuò)誤提示信息}finally{無論try/catch的結(jié)果如何都會(huì)執(zhí)行。}
86、JavaScript中不同類型的錯(cuò)誤有幾種?
有3種類型的錯(cuò)誤。
Load time errors,該錯(cuò)誤發(fā)生于加載網(wǎng)頁時(shí),例如出現(xiàn)語法錯(cuò)誤等狀況,稱為加載時(shí)間錯(cuò)誤,并且會(huì)動(dòng)態(tài)生成錯(cuò)誤。
Run time errors,由于在HTML語言中濫用命令而導(dǎo)致的錯(cuò)誤。
Logical errors,這是由于在具有不同操作的函數(shù)上執(zhí)行了錯(cuò)誤邏輯而發(fā)生的錯(cuò)誤。
87、在 JavaScript中,push方法的作用是什么?
push方法用于將一個(gè)或多個(gè)元素添加或附加到數(shù)組的末尾。使用這種方法,可通過傳遞多個(gè)參數(shù)來附加多個(gè)元素。
88、在 JavaScript中, unshift方法的作用是什么?
unshift方法就像在數(shù)組開頭工作的push方法。該方法用于將一個(gè)或多個(gè)元素添加到數(shù)組的開頭。
89、如何為對(duì)象添加屬性?
為對(duì)象添加屬性有兩種常用語法。
中括號(hào)語法,比如obj[" class"]=12。
點(diǎn)語法,比如 obj. class=12。
90、獲得 CheckBox狀態(tài)的方式是什么?
alert( document getElement Byld('checkbox1') .checked;
如果 CheckBox選中,此警告將返回TRUE。
91、解釋一下 window. onload和 onDocumentReady。
在載入頁面的所有信息之前,不運(yùn)行 window. onload。這導(dǎo)致在執(zhí)行任何代碼之前會(huì)出現(xiàn)延遲。
window.onDocumentReady在加載DOM之后加載代碼。這允許代碼更早地執(zhí)行(早于 window. onload)。
92、如何理解 JavaScript中的閉包?
閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。
閉包的用途有兩個(gè),一是可以讀取函數(shù)內(nèi)部的變量,二是讓這些變量的值始終保持在內(nèi)存中。
93、如何把一個(gè)值附加到數(shù)組中?
可以在數(shù)組末尾處添加成員arr[ arr length]= value;或者調(diào)用push方法 arr.push(value)。
94、解釋一下for-in循環(huán)。
for-in循環(huán)用于循環(huán)對(duì)象的屬性。
for-in循環(huán)的語法如下。
for (var iable name in object){}
在每次循環(huán)中,來自對(duì)象的一個(gè)屬性與變量名相關(guān)聯(lián),循環(huán)繼續(xù),直到對(duì)象的所有屬性都被遍歷。
95、描述一下 JavaScript中的匿名函數(shù)。
被聲明為沒有任何命名標(biāo)識(shí)符的函數(shù)稱為匿名函數(shù)。一般來說,匿名函數(shù)在聲明后無法訪問。
匿名函數(shù)聲明示例如下。
var anon=function(){alert('I am anonymous' );anon();
96、和DOM事件流的區(qū)別是什么?
區(qū)別如下。
(1)執(zhí)行順序不一樣
(2)參數(shù)不一樣。
(3)事件名稱是否加on不一樣。
(4)this指向問題不一樣。
97、闡述一下事件冒泡。
Java Script允許DOM元素嵌套在一起。在這種情況下,如果單擊子級(jí)的處理程序,父級(jí)的處理程序也將執(zhí)行同樣的工作。
98、JavaScript里函數(shù)參數(shù) arguments是數(shù)組嗎?
在函數(shù)代碼中,使用特殊對(duì)象 arguments,開發(fā)者無須明確指出參數(shù)名,使用下標(biāo)就可以訪問相應(yīng)的參數(shù)。
arguments雖然有數(shù)組的性質(zhì),但其并非真正的數(shù)組。它只是一個(gè)類數(shù)組對(duì)象,并沒有數(shù)組的方法,不能像真正的數(shù)組那樣調(diào)用 .join()、, .concat()、.pop()等方法。
99、什么是構(gòu)造函數(shù)?它與普通函數(shù)有什么區(qū)別?
構(gòu)造函數(shù)是一種特殊的方法,主要用來創(chuàng)建對(duì)象時(shí)初始化對(duì)象,經(jīng)常與new運(yùn)算符一起使用,創(chuàng)建對(duì)象的語句中構(gòu)造函數(shù)的名稱必須與類名完全相同。
與普通函數(shù)相比,區(qū)別如下
(1)構(gòu)造函數(shù)只能由new關(guān)鍵字調(diào)用
(2)構(gòu)造函數(shù)可以創(chuàng)建實(shí)例化對(duì)象
(3)構(gòu)造函數(shù)是類的標(biāo)志。
100、請(qǐng)解釋一下 JavaScript和CSS阻塞。
JavaScript的阻塞特性是所有瀏覽器在下載 JavaScript代碼的時(shí)候,會(huì)阻止其他一切活動(dòng),比如其他資源的下載,內(nèi)容的呈現(xiàn)等,直到 JavaScript代碼下載、解析、執(zhí)行完畢后才開始繼續(xù)并行下載其他資源并渲染內(nèi)容。
為了提高用戶體驗(yàn),新一代瀏覽器都支持并行下載 JavaScript代碼,但是 JavaScript代碼的下載仍然會(huì)阻塞其他資源的下載(例如圖片、CSS文件等)。
為了防止 JavaScript修改DOM樹,瀏覽器需要重新構(gòu)建DOM樹,所以就會(huì)阻塞其他資源的下載和渲染。
嵌入的 JavaScript代碼會(huì)阻塞所有內(nèi)容的呈現(xiàn),而外部 JavaScript代碼只會(huì)阻塞其后內(nèi)容的顯示,兩種方式都會(huì)阻塞其后資源的下載。也就是說,外部腳本不會(huì)阻塞外部腳本的加載,但會(huì)阻塞外部腳本的執(zhí)行。
CSS本來是可以并行加載的,但是當(dāng)CSS后面跟著嵌入的 JavaScript代碼的時(shí)候,該CSS就會(huì)阻塞后面資源的下載。
而當(dāng)把嵌入的 JavaScript代碼放到CSS前面時(shí),就不會(huì)出現(xiàn)阻塞的情況了(在IE6下CSS都會(huì)阻塞加載)。
根本原因是因?yàn)闉g覽器會(huì)維持HTML中CSS和 JavaScript代碼的順序,樣式表必須在嵌入的 JavaScript代碼執(zhí)行前先加載、解析完。而嵌入的 JavaScript代碼會(huì)阻塞后面的資源加載,所以就會(huì)出現(xiàn)CSS阻塞資源加載的情況。
推薦閱讀
本文完~

