<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 17276字,需瀏覽 35分鐘

           ·

          2021-03-04 10:12


          JavaScript一直都是前端面試的重頭戲,也是最核心的部分。 JavaScript也是囊括知識點最多的部分,從BOM到DOM,從 ECMAScript編程到簡單算法的實現(xiàn)等,都是 JavaScript部分面試題主要考察的內(nèi)容。
          當(dāng)然,這里的重中之重當(dāng)屬事件和DOM操作,這也是 JavaScript的核心部分。在 ECMAScript中,小到運(yùn)算符,大到函數(shù)的閉包、作用域,以及原型鏈等都是應(yīng)試者必須掌握的技術(shù)知識。
          今天我們?yōu)榇蠹覝?zhǔn)備了一些常見的JavaScript基礎(chǔ)面試題,一共有200多道題,因為內(nèi)容比較多,我們拆分為上下兩篇,今天這篇里一共有100道面試題。

          1、JavaScript有哪些垃圾回收機(jī)制?

          有以下垃圾回收機(jī)制。

          標(biāo)記清除( mark and sweep)

          這是 JavaScript最常見的垃圾回收方式。當(dāng)變量進(jìn)入執(zhí)行環(huán)境的時候,比如在函數(shù)中聲明一個變量,垃圾回收器將其標(biāo)記為“進(jìn)入環(huán)境”。當(dāng)變量離開環(huán)境的時候(函數(shù)執(zhí)行結(jié)束),將其標(biāo)記為“離開環(huán)境”。

          垃圾回收器會在運(yùn)行的時候給存儲在內(nèi)存中的所有變量加上標(biāo)記,然后去掉環(huán)境中的變量,以及被環(huán)境中變量所引用的變量(閉包)的標(biāo)記。在完成這些之后仍然存在的標(biāo)記就是要刪除的變量。

          引用計數(shù)( reference counting)

          在低版本的E中經(jīng)常會發(fā)生內(nèi)存泄漏,很多時候就是因為它采用引用計數(shù)的方式進(jìn)行垃圾回收。引用計數(shù)的策略是跟蹤記錄每個值被使用的次數(shù)。

          當(dāng)聲明了一個變量并將個引用類型賦值給該變量的時候,這個值的引用次數(shù)就加1.如果該變量的值變成了另外一個,則這個值的引用次數(shù)減1.當(dāng)這個值的引用次數(shù)變?yōu)?的時候,說明沒有變量在使用,這個值沒法被訪問。

          因此,可以將它占用的空間回收,這樣垃圾回收器會在運(yùn)行的時候清理引用次數(shù)為0的值占用的空間在正中雖然 JavaScript對象通過標(biāo)記清除的方式進(jìn)行垃圾回收,但是BOM與DOM對象是用引用計數(shù)的方式回收垃圾的。

          也就是說,只要涉及BOM和DOM,就會出現(xiàn)循環(huán)引用問題

          2、列舉幾種類型的DOM節(jié)點

          有以下幾類DOM節(jié)點。

          整個文檔是一個文檔( Document)節(jié)點。

          每個HTML標(biāo)簽是一個元素( Element)節(jié)點。

          每一個HTML屬性是一個屬性( Attribute)節(jié)點。

          包含在HTML元素中的文本是文本(Text)節(jié)點。

          3、談?wù)?script標(biāo)簽中 defer和 async屬性的區(qū)別。

          區(qū)別如下。

          (1) defer屬性規(guī)定是否延遲執(zhí)行腳本,直到頁面加載為止, async屬性規(guī)定腳本一旦可用,就異步執(zhí)行。

          (2) defer并行加載 JavaScript文件,會按照頁面上 script標(biāo)簽的順序執(zhí)行, async并行加載 JavaScript文件,下載完成立即執(zhí)行,不會按照頁面上 script標(biāo)簽的順序執(zhí)行。

          4、說說你對閉包的理解。

          使用閉包主要是為了設(shè)計私有的方法和變量。閉包的優(yōu)點是可以避免全局變量的污染;缺點是閉包會常駐內(nèi)存,增加內(nèi)存使用量,使用不當(dāng)很容易造成內(nèi)存泄漏。在JavaScript中,函數(shù)即閉包,只有函數(shù)才會產(chǎn)生作用域閉包有3個特性

          (1)函數(shù)嵌套函數(shù)。

          (2)在函數(shù)內(nèi)部可以引用外部的參數(shù)和變量

          (3)參數(shù)和變量不會以垃圾回收機(jī)制回收

          5、解釋一下 unshift0方法。

          該方法在數(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)容,每次都會刷新,因此很慢。在 innerHTML中沒有驗證的機(jī)會,因此更容易在文檔中插入錯誤代碼,使網(wǎng)頁不穩(wěn)定。

          8、如何在不支持 JavaScript的舊瀏覽器中隱藏 JavaScript代碼?

          在< script>標(biāo)簽之后的代碼中添加“<!--”,不帶引號。

          在< /script>標(biāo)簽之前添加“//-->”,代碼中沒有引號。

          舊瀏覽器現(xiàn)在將 JavaScript代碼視為一個長的HTML注釋,而支持 JavaScript的瀏覽器則將"<!-"和"http://-->"作為一行注釋。

          9、在DOM操作中怎樣創(chuàng)建、添加、移除、替換、插入和查找節(jié)點?

          具體方法如下。

          (1)通過以下代碼創(chuàng)建新節(jié)點。

          createDocument Fragment ()//創(chuàng)建一個D0M片段createElement ()//創(chuàng)建一個具體的元素createTextNode ()//創(chuàng)建一個文本節(jié)點

          (2)通過以下代碼添加、移除、替換、插入節(jié)點

          appendchild()removechild()eplacechild ()insertBefore ()//并沒有 insertAfter()(3)通過以下代碼查找節(jié)點。getElementsByTagName ()//通過標(biāo)簽名稱查找節(jié)點getElementsByName ()//通過元素的name屬性的值查找節(jié)點(IE容錯能力較強(qiáng),會得到一個數(shù)//組,其中包括id等于name值的節(jié)點)getElementById(//通過元素Id查找節(jié)點,具有唯一性

          10、如何實現(xiàn)瀏覽器內(nèi)多個標(biāo)簽頁之間的通信?

          調(diào)用 localstorge、 cookie等數(shù)據(jù)存儲通信方式

          11、null和 undefined的區(qū)別是什么?

          null是一個表示“無”的對象,轉(zhuǎn)為數(shù)值時為0;undefined是一個表示“無”的原始值,轉(zhuǎn)為數(shù)值時為NaN。

          當(dāng)聲明的變量還未初始化時,變量的默認(rèn)值為 undefined 。

          null用來表示尚未存在的對象,常用來表示函數(shù)企圖返回一個不存在的對象。

          undefined表示“缺少值”,即此處應(yīng)該有一個值,但是還沒有定義,典型用法是如下。

          (1)如果變量聲明了,但沒有賦值,它就等于 undefined

          (2)當(dāng)調(diào)用函數(shù)時,如果沒有提供應(yīng)該提供的參數(shù),該參數(shù)就等于 undefined。

          (3)如果對象沒有賦值,該屬性的值為 undefined。

          (4)當(dāng)函數(shù)沒有返回值時,默認(rèn)返回 undefined。

           null表示“沒有對象”,即此處不應(yīng)該有值,典型用法是如下。

          (1)作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象。

          (2)作為對象原型鏈的終點。

          12、new操作符的作用是什么?

          作用如下:

          (1)創(chuàng)建一個空對象。

          (2)由this變量引用該對象

          (3)該對象繼承該函數(shù)的原型(更改原型鏈的指向)

          (4)把屬性和方法加入到this引用的對象中。

          (5)新創(chuàng)建的對象由this引用,最后隱式地返回this,過程如下:

          var obj ={};obj._ _ proto_ _ Base .prototype; Base .call(obj);

          13、JavaScript延遲加載的方式有哪些?

          包括 defer和 async、動態(tài)創(chuàng)建DOM(創(chuàng)建 script,插入DOM中,加載完畢后回調(diào)、按需異步載入 JavaScript。

          14、call()和apply()的區(qū)別和作用是什么?

          作用都是在函數(shù)執(zhí)行的時候,動態(tài)改變函數(shù)的運(yùn)行環(huán)境(執(zhí)行上下文)。

          call和 apply的第一個參數(shù)都是改變運(yùn)行環(huán)境的對象。

          區(qū)別如下。

          call從第二個參數(shù)開始,每一個參數(shù)會依次傳遞給調(diào)用函數(shù);apply的第二個參數(shù)是數(shù)組,數(shù)組的每一個成員會依次傳遞給調(diào)用函數(shù)。

          func, call(funcl, varl, var2, var3)

          對應(yīng)的 apply寫法為:

          func. apply (funcl, [varl, var2, var3])

          15、哪些操作會造成內(nèi)存泄漏?

          內(nèi)存泄漏指不再擁有或需要任何對象(數(shù)據(jù))之后,它們?nèi)匀淮嬖谟趦?nèi)存中。

          提示:垃圾回收器定期掃描對象,并計算引用了每個對象的其他對象的數(shù)量。如果一個對象的引用數(shù)量為0(沒有其他對象引用過該對象),或?qū)υ搶ο蟮奈ㄒ灰檬茄h(huán)的,那么該對象占用的內(nèi)存立即被回收。

          如果 setTimeout的第一個參數(shù)使用字符串而非函數(shù),會引發(fā)內(nèi)存泄漏閉包、控制臺日志、循環(huán)(在兩個對象彼此引用且彼此保留時,就會產(chǎn)生一個循環(huán))等會造內(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)對于鼠標(biāo)位置:IE使用 event. clientX;Firefox使用 event. pageX。

          (6)IE使用 event. srcElement;Firefox使用 event. target

          (7)要消除list的原點,IE中僅須使 margin:0即可達(dá)到最終效果;Firefox中需要設(shè)置margin:0、 padding:0和 list-style:none

          (8)CSS圓角:IE7以下不支持圓角。

          17、講解一下 JavaScript對象的幾種創(chuàng)建方式。

          有以下創(chuàng)建方式:

          (1) Object構(gòu)造函數(shù)式。

          (2)對象字面量式。

          (3)工廠模式。

          (4)安全工廠模式。

          (5)構(gòu)造函數(shù)模式。

          (6)原型模式。

          (7)混合構(gòu)造函數(shù)和原型模式。

          (8)動態(tài)原型模式。

          (9)寄生構(gòu)造函數(shù)模式。

          (10)穩(wěn)妥構(gòu)造函數(shù)模式。

          18、如何實現(xiàn)異步編程?

          具體方法如下:

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

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

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

          方法4,通過 Promise對象實現(xiàn), Promise對象是 Commonjs工作組提出的一種規(guī)范,旨在為異步編程提供統(tǒng)一接口。它的思想是,每一個異步任務(wù)返回一個 Promise對象,該對象有一個then方法,允許指定回調(diào)函數(shù)。

          19、請解釋一下 JavaScript的同源策略。

          同源策略是客戶端腳本(尤其是 JavaScript)的重要安全度量標(biāo)準(zhǔn)。它最早出自Netscape Navigator2.0,目的是防止某個文檔或腳本從多個不同源裝載。

          這里的同源策略指的是協(xié)議、域名、端口相同。同源策略是一種安全協(xié)議。指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。

          20、為什么要有同源限制?

          我們舉例說明。比如一個黑客,他利用 Iframe把真正的銀行登錄頁面嵌到他的頁面上,當(dāng)你使用真實的用戶名、密碼登錄時,他的頁面就可以通過 Javascript讀取到你表單上 Input中的內(nèi)容,這樣黑客就會輕松得到你的用戶名和密碼。

          21、在 JavaScript中,為什么說函數(shù)是第一類對象?

          第一類函數(shù)即 JavaScript中的函數(shù)。這通常意味著這些函數(shù)可以作為參數(shù)傳遞給其他函數(shù),作為其他函數(shù)的值返回,分配給變量,也可以存儲在數(shù)據(jù)結(jié)構(gòu)中。

          22、什么是事件?E與 Firefox的事件機(jī)制有什么區(qū)別?如何阻止冒泡?

          事件是在網(wǎng)頁中的某個操作(有的操作對應(yīng)多個事件)例如,當(dāng)單擊一個按鈕時,就會產(chǎn)生一個事件,它可以被 JavaScript偵測到,在事件處理機(jī)制上,正E支持事件冒泡;Firefox同時支持兩種事件模型,也就是捕獲型事件和冒泡型事件。

          阻止方法是 ev.stop Propagation.注意舊版E中的方法 ev. cancelBubble=true.

          23、函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別?

          在 JavaScript中,在向執(zhí)行環(huán)境中加載數(shù)據(jù)時,解析器對函數(shù)聲明和函數(shù)表達(dá)式并非是一視同仁的。解析器會首先讀取函數(shù)聲明,并使它在執(zhí)行任何代碼之前可用(可以訪問)。至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行,才會真正解析和執(zhí)行它。

          24、如何刪除一個 cookie?

          為了刪除 cookie,要修改 expires,代碼如下。

          document. cookie ='user=icketang;expires ='+ new Date(0)

          25、編寫一個方法,求一個字符串的長度(單位是字節(jié))

          假設(shè)一個英文字符占用一字節(jié),一個中文字符占用兩字節(jié):

          function GetBytes(str){ var len=str .length; var bytes= len; forvar i-0:i<len;1++){if (str. charcodeAt (i)>255) bytes++;}return bytes;}alert( GetBytes("hello 有課前端網(wǎng)!"));

          26、對于元素, attribute和 property的區(qū)別是什么?

          attribute是DOM元素在文檔中作為HTML標(biāo)簽擁有的屬性;property就是DOM元素在 JavaScript中作為對象擁有的屬性。

          對于HTML的標(biāo)準(zhǔn)屬性來說, attribute和 property是同步的,會自動更新,但是對于自定義的屬性來說,它們是不同步的。

          27、解釋延遲腳本在 JavaScript中的作用。

          默認(rèn)情況下,在頁面加載期間,HTML代碼的解析將暫停,直到腳本停止執(zhí)行。

          這意味著,如果服務(wù)器速度較慢或者腳本特別“沉重”,則會導(dǎo)致網(wǎng)頁延遲。在使用Deferred時,腳本會延遲執(zhí)行,直到HTML解析器運(yùn)行。這縮短了網(wǎng)頁的加載時間,并且它們的顯示速度更快。

          28、什么是閉包( closure)?

          為了說明閉包,創(chuàng)建一個閉包。

          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)部的變量會存在,而閉包內(nèi)部函數(shù)的內(nèi)部變量不會存在,使得 JavaScript的垃圾回收機(jī)制不會收回hello()占用的資源,因為hell()中內(nèi)部函數(shù)的執(zhí)行需要依賴 hello()中的變量。

          29、如何判斷一個對象是否屬于某個類?

          使用 instanceof關(guān)鍵字,判斷一個對象是否是類的實例化對象;使用 constructor屬性,判斷一個對象是否是類的構(gòu)造函數(shù)。

          30、JavaScript中如何使用事件處理程序?

          事件是由用戶與頁面的交互(例如單擊鏈接或填寫表單)導(dǎo)致的操作。需要個事件處理程序來保證所有事件的正確執(zhí)行。事件處理程序是對象的額外屬性。此屬性包括事件的名稱和事件發(fā)生時采取的操作。

          31、在 JavaScript中有一個函數(shù),執(zhí)行直接對象查找時,它始終不會查找原型,這個函數(shù)是什么?

          hasOwnProperty。

          32、在 JavaScript中如何使用DOM?

          DOM代表文檔對象模型,并且負(fù)責(zé)文檔中各種對象的相互交互。DOM是開發(fā)網(wǎng)頁所必需的,其中包括諸如段落、鏈接等對象??梢圆僮鬟@些對象,如添加或刪除等。為此,DOM還需要向網(wǎng)頁添加額外的功能。

          33、documen.wrte和 innerHTML的區(qū)別是什么?

          document.wite重繪整個頁面;innerHTML可以重繪頁面的一部分。

          34、在 JavaScript中讀取文件的方法是什么?

          可以通過如下方式讀取服務(wù)器中的文件內(nèi)容。

          function readAjaxEile(url) {//創(chuàng)建xhr var 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)}//打開請求xhr.open('GET', url, true)//發(fā)送數(shù)據(jù)xhr, send(null)}

          可以通過如下方式讀取本地計算機(jī)中的內(nèi)容。

          function readInputFile(id) { var file= document. getElementById(id). files[0];//實例化 FileReader var reader=new FileReader();//讀取文件reader. readAsText (file)//監(jiān)聽返回reader, onload= function (data) { console. log (data, this .result)}}

          35、如何分配對象屬性?

          將屬性分配給對象的方式與賦值給變量的方式相同。例如,表單對象的操作值以下列方式分配給" submit":document.form. action=" submit'"

          36、請說幾條書寫 JavaScript語句的基本規(guī)范。

          基本規(guī)范如下:

          (1)不要在同一行聲明多個變量。

          (2)應(yīng)使用==/!==來比較true/ false或者數(shù)值。

          (3)使用對象字面量替代 new Array這種形式。

          (4)不要使用全局函數(shù)。

          (5) switch語句必須帶有 default分支。

          (6)函數(shù)不應(yīng)該有時有返回值,有時沒有返回值。

          (7)for循環(huán)必須使用大括號括起來。

          (8)if語句必須使用大括號括起來。

          9)for-in循環(huán)中的變量應(yīng)該使用war關(guān)鍵字明確限定的作用域,從而避免作用域污染。

          37、eva的功能是什么?

          它的功能是把對應(yīng)的字符串解析成 Javascript代碼并運(yùn)行應(yīng)該避免使用eval,它會造成程序不安全,非常影響性能(執(zhí)行兩次,一次解析成JavaScript語句,一次執(zhí)行)

          38、["1,"2,"3"].map( parselnt)的執(zhí)行結(jié)果是多少?

          [1,NaN,NaN],因為 parseInt需要兩個參數(shù)(val, radix),其中 radix表示解析時用的基數(shù)(進(jìn)制);map傳遞了3個參數(shù)(item, index,aray),對應(yīng)的radix不合法導(dǎo)致解析失敗。

          39、談?wù)勀銓his對象的理解。

          this是 JavaScript的一個關(guān)鍵字,隨著函數(shù)使用場合的不同,this的值會發(fā)生變化。但是有一個總原則,即this指的是調(diào)用函數(shù)的那個對象一般情況下,this是全局對象 Global,可以作為方法調(diào)用

          40、Web- garden和web-farm有什么不同?

          web-garden和 web-farm都是網(wǎng)絡(luò)托管系統(tǒng)。唯一的區(qū)別是 web-garden是在單個服務(wù)器中包含許多處理器的設(shè)置,而web-farm是使用多個服務(wù)器的較大設(shè)置。

          41、說一下 document. write0的用法。

          document. write()方法可以用在兩個地方,頁面載入過程中用實時腳本創(chuàng)建頁面內(nèi)容,以及用延時腳本創(chuàng)建本窗口或新窗口的內(nèi)容document. write只能重繪整個頁面, innerHTML可以重繪頁面的一部分。

          42、在 JavaScript中什么是類(偽)數(shù)組?如何將類(偽)數(shù)組轉(zhuǎn)化為標(biāo)準(zhǔn)數(shù)組?

          典型的類(偽)數(shù)組是函數(shù)的 argument參數(shù),在調(diào)用 getElements By TagName和 document .childNodes方法時,它們返回的 NodeList對象都屬于偽數(shù)組??梢允褂肁rray .prototype. slice. call( fake Array)將數(shù)組轉(zhuǎn)化為真正的Aray對象。

          43、JavaScript中callee和 caller的作用是什么?

          caller返回一個關(guān)于函數(shù)的引用,該函數(shù)調(diào)用了當(dāng)前函數(shù);callee返回正在執(zhí)行的函數(shù),也就是指定的 function對象的正文。

          44、講一下手寫數(shù)組快速排序的步驟。

          "快速排序”的思想很簡單,整個排序過程只需要3步

          (1)在數(shù)據(jù)集之中,選擇一個元素作為“基準(zhǔn)”( pivot)。

          (2)將所有小于“基準(zhǔn)”的元素,都移到“基準(zhǔn)”的左邊;將所有大于“基準(zhǔn)”的元素,都移到“基準(zhǔn)”的右邊。

          (3)對“基準(zhǔn)”左邊和右邊的兩個子集,不斷重復(fù)第(1)步和第(2)步,直到所有子集只剩下一個元素為止。

          45、如何統(tǒng)計字符串“ aaaabbbccccddfgh”中字母的個數(shù)或統(tǒng)計最多的字母數(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、寫一個 function,清除字符串前后的空格(兼容所有瀏覽器)。

          具體代碼如下

          function trim(str){if (str && typeof str === "string"){ return str.replace(/^\s+1\s+$/g,"");//去除前后空白符。

          47、列出不同瀏覽器中關(guān)于 JavaScript兼容性的兩個常見問題。

          (1)事件綁定兼容性問題。

          IE8以下的瀏覽器不支持用 add Event Listener來綁定事件,使用 attachement可以解決這個問題

          (2) stopPropagation兼容性問題

          IE8以下的瀏覽器不支持用 e .stopPropagation()來阻止事件傳播,使用 e .return Value =false可以解決這個問題。

          48、閉包的優(yōu)缺點是什么?

          優(yōu)點是不產(chǎn)生全局變量,實現(xiàn)屬性私有化缺點是閉包中的數(shù)據(jù)會常駐內(nèi)存,在不用的時候需要刪除,否則會導(dǎo)致內(nèi)存溢出(內(nèi)存泄漏)。

          49、用 JavaScript實現(xiàn)一個數(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])}}//返回數(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)后,會返回['a',null, undefined,'e',['d],'c','b']。

          50、說明正則表達(dá)式給所有string對象添加去除首尾空白符的方法(trim方法)。

          代碼如下。

          prototype. trim= function(){return this .replace(/^\s+I\s+$/g," );};

          51、說明用 JavaScript實現(xiàn)一個提取電話號碼的方法。

          代碼如下

          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);

          測試“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ā)語言,同時, JavaScript也是面向?qū)ο蟮木幊陶Z言。

          55、列舉Java和 JavaScript的不同之處。

          Java是一門十分完整、成熟的編程語言。相比之下, JavaScript是一個可以被引入HTML頁面的編程語言。這兩種語言并不完全相互依賴,而是針對不同的意圖而設(shè)計的。Java是一種面向?qū)ο缶幊蹋∣OP)或結(jié)構(gòu)化編程語言,類似的語言有C++;而 JavaScript是客戶端腳本語言,它稱為非結(jié)構(gòu)化編程。

          56、JavaScript和ASP腳本相比,哪個更快?

          JavaScript更快。JavaScript是一種客戶端語言,因此它不需要Web服務(wù)器的協(xié)助就可以執(zhí)行;ASP是服務(wù)器端語言,因此它總是比 JavaScript慢,值得注意的是, JavaScript現(xiàn)在也可用于服務(wù)器端語言( Node. js)

          57、什么是負(fù)無窮大?

          Infinity代表了超出 JavaScript處理范圍的數(shù)值。也就是說, JavaScript無法處理的數(shù)值都是 Infinity.實踐證明, JavaScript所能處理的最大值( Number. MAX VALUE)是17976931348623157e+308,超過該數(shù)則為正無窮大;而最小值( Number. MIN VALUE)

          是5e-324,小于該數(shù)則為0.所以負(fù)無窮大代表的是小于- Number MAX VALUE的數(shù)字, JavaScript中對應(yīng)靜態(tài)變量 Number NEGATIVE INFINITY

          58、如何將 JavaScript代碼分解成幾行?

          M:在字符串語句中可以通過在第一行末尾使用反斜杠“\”來完成,例如, document. write("This is \a program")。

          如果不是在字符串語句中更改為新行,那么 JavaScript會忽略行中的斷點下面的代碼是完美的,但并不建議這樣做,因為阻礙了調(diào)試。

          var x=l, y=2,z=X+y;

          59、什么是未聲明和未定義的變量?

          未聲明的變量是程序中不存在且未聲明的變量。如果程序嘗試讀取未聲明變量的值,則會在運(yùn)行時遇到錯誤。未定義的變量是在程序中聲明但尚未給出任何值的變量如果程序嘗試讀取未定義變量的值,則返回未定義的值60.:如何編寫可動態(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、什么是全局變量?這些變量如何聲明?使用全局變量有哪些問題?

          全局變量是整個代碼中都可用的變量,也就是說,這些變量沒有任何作用域var關(guān)鍵字用于聲明局部變量,如果省略var關(guān)鍵字,則聲明一個全局變量使用全局變量面臨的問題是局部變量和全局變量名稱的沖突。此外,很難調(diào)試和測試依賴于全局變量的代碼。

          62、解釋 JavaScript中定時器的工作,并說明使用定時器的缺點。

          定時器用于在設(shè)定的時間執(zhí)行一段代碼,或者在給定的時間間隔內(nèi)重復(fù)該代碼這通過使用函數(shù) setTimeout、setInterval和 clearInterva來完成。

          setTimeout( function, delay)函數(shù)用于啟動在所屬延遲之后調(diào)用特定功能的定時器。

          setInterval( function,dlay)函數(shù)用于在提到的延遲中重復(fù)執(zhí)行給定的功能,只有在取消時才停止。

          clearInterval(id)函數(shù)指示定時器停止定時器在一個線程內(nèi)運(yùn)行,因此事件可能需要排隊等待執(zhí)行。

          63、ViewState和 SessionState有什么區(qū)別?

          View State特定于會話中的頁面; SessionState特定于可在Web應(yīng)用程序中的所有頁面上訪問的用戶特定數(shù)據(jù)。

          64、什么是===運(yùn)算符?

          ===稱為嚴(yán)格等式運(yùn)算符,當(dāng)兩個操作數(shù)具有相同的值和類型時,該運(yùn)算符返回true。

          65、說明如何使用 JavaScript提交表單。

          要使用 JavaScript提交表單,可以使用以下代碼。

          document .form [0] .submit();

          66、元素的樣式/類如何改變?

          可以通過以下方式改變元素的樣式。

          document. getElementById("myText").style. fontsize ="20";

          可以通過以下方式改變元素的類。

          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ù)解析一個字符串參數(shù),并返回一個指定基數(shù)的整數(shù)。 parselnt()將要轉(zhuǎn)換的字符串作為其第一個參數(shù),第二個參數(shù)是給定字符串的轉(zhuǎn)換進(jìn)制基數(shù)。

          為了將4F(基數(shù)16)轉(zhuǎn)換為整數(shù),可以使用代碼 parrent("4F",16)。

          69、說明“==”和“===”的區(qū)別。

          “==”僅檢查值相等性,而“===”用于更嚴(yán)格的等式判定。如果兩個變量的值或類型不同,則后者返回 false。

          70、3+2+“7”的結(jié)果是什么?

          由于3和2是整數(shù),它們將直接相加,同時由于“7”是一個字符串,將會被直連接,因此結(jié)果將是57。

          71、如何檢測客戶端機(jī)器上的操作系統(tǒng)?

          為了檢測客戶端機(jī)器上的操作系統(tǒng),應(yīng)使用 navigator.app Version字符串(屬性)。

          72、JavaScript中的null表示什么?

          null用于表示無值或無對象。它意味著沒有對象或空字符串,沒有有效的布爾沒有數(shù)值和數(shù)組對象

          73、delete操作符的功能是什么?

          delete操作符用于刪除對象中的某個屬性,但不能刪除變量、函數(shù)等。

          74、JavaScript中有哪些類型的彈出框?

          ua; alert、 confirm和 prompt。

          75、void(0)的作用是什么?

          void操作符使表達(dá)式的運(yùn)算結(jié)果返回 undefined。

          void(0)用于防止頁面刷新,并在調(diào)用時傳遞參數(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)使用特殊字符(如單引號、雙引號、撇號和&符號)時,將使用轉(zhuǎn)義字符(反斜杠)。在字符前放置反斜杠,使其顯示。

          下面給出兩個示例。

          document. write"I m a "good"boy "document. write"I m a\"good\"boy"

          78、什么是 JavaScript cookie?

          cookie是存儲在訪問者計算機(jī)中的變量。每當(dāng)一臺計算機(jī)通過瀏覽器請求某個頁面時,就會發(fā)送這個 cookie。可以使用 JavaScript來創(chuàng)建和獲取 cookie的值。

          79、解釋 JavaScript中的pop()方法。

          pop()方法與shift()方法類似,但不同之處在于shift()方法在數(shù)組的開頭工作。此外,pop()方法將最后一個元素從給定的數(shù)組中取出并返回,然后改變被調(diào)用的數(shù)組例如:

          var colors = ["red","blue","green"]; colors. pop ();// colors :["red","blue"]
          80、在 JavaScript中使用 innerHTML的缺點是什么?
          缺點如下:
          (1)內(nèi)容隨處可見
          (2)不能像“追加到 innerHTML”一樣使用。
          (3)即使使用+=,如" innerHTML= innerhTML+'htm'",舊的內(nèi)容仍然會被HTML替換。

          (4)整個 innerHTML內(nèi)容被重新解析并構(gòu)建成元素,因此它的速度要慢得多。

          (5) innerHTML不提供驗證,因此可能會在文檔中插入具有破壞性的HTML并將其中斷。

          81、break和 continue語句的作用是什么?

          break語句從當(dāng)前循環(huán)中退出; continue語句繼續(xù)下一個循環(huán)語句。

          82、在 JavaScript中, datatypes的兩個基本組是什么?

          兩個基本組是原始類型和引用類型。

          原始類型包括數(shù)字和布爾類型。引用類型包括更復(fù)雜的類型,如字符串和日期。

          83、如何創(chuàng)建通用對象?

          通用對象可以通過以下代碼創(chuàng)建。

          var o= new Object ()。

          84、typeof是用來做什么的?

          typeof是一個運(yùn)算符,用于返回變量類型的字符串描述。

          85、哪些關(guān)鍵字用于處理異常?

          try...catch...finally用于處理 JavaScript中的異常。try{執(zhí)行代碼}catch(exp){ 拋出錯誤提示信息}finally {無論try/catch的結(jié)果如何都會執(zhí)行。}

          86、JavaScript中不同類型的錯誤有幾種?

          有3種類型的錯誤。

          Load time errors,該錯誤發(fā)生于加載網(wǎng)頁時,例如出現(xiàn)語法錯誤等狀況,稱為加載時間錯誤,并且會動態(tài)生成錯誤。

          Run time errors,由于在HTML語言中濫用命令而導(dǎo)致的錯誤。

          Logical errors,這是由于在具有不同操作的函數(shù)上執(zhí)行了錯誤邏輯而發(fā)生的錯誤。

          87、在 JavaScript中,push方法的作用是什么?

          push方法用于將一個或多個元素添加或附加到數(shù)組的末尾。使用這種方法,可通過傳遞多個參數(shù)來附加多個元素。

          88、在 JavaScript中, unshift方法的作用是什么?

          unshift方法就像在數(shù)組開頭工作的push方法。該方法用于將一個或多個元素添加到數(shù)組的開頭。

          89、如何為對象添加屬性?

          為對象添加屬性有兩種常用語法。

          中括號語法,比如obj[" class"]=12。

          點語法,比如 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í)行任何代碼之前會出現(xiàn)延遲。

          window.onDocumentReady在加載DOM之后加載代碼。這允許代碼更早地執(zhí)行(早于 window. onload)。

          92、如何理解 JavaScript中的閉包?

          閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。

          閉包的用途有兩個,一是可以讀取函數(shù)內(nèi)部的變量,二是讓這些變量的值始終保持在內(nèi)存中。

          93、如何把一個值附加到數(shù)組中?

          可以在數(shù)組末尾處添加成員arr[ arr length]= value;或者調(diào)用push方法 arr.push(value)。

          94、解釋一下for-in循環(huán)。

          for-in循環(huán)用于循環(huán)對象的屬性。

          for-in循環(huán)的語法如下。

          for (var iable name in object){}

          在每次循環(huán)中,來自對象的一個屬性與變量名相關(guān)聯(lián),循環(huán)繼續(xù),直到對象的所有屬性都被遍歷。

          95、描述一下 JavaScript中的匿名函數(shù)。

          被聲明為沒有任何命名標(biāo)識符的函數(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元素嵌套在一起。在這種情況下,如果單擊子級的處理程序,父級的處理程序也將執(zhí)行同樣的工作。

          98、JavaScript里函數(shù)參數(shù) arguments是數(shù)組嗎?

          在函數(shù)代碼中,使用特殊對象 arguments,開發(fā)者無須明確指出參數(shù)名,使用下標(biāo)就可以訪問相應(yīng)的參數(shù)。

          arguments雖然有數(shù)組的性質(zhì),但其并非真正的數(shù)組。它只是一個類數(shù)組對象,并沒有數(shù)組的方法,不能像真正的數(shù)組那樣調(diào)用 .join()、, .concat()、.pop()等方法。

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

          構(gòu)造函數(shù)是一種特殊的方法,主要用來創(chuàng)建對象時初始化對象,經(jīng)常與new運(yùn)算符一起使用,創(chuàng)建對象的語句中構(gòu)造函數(shù)的名稱必須與類名完全相同。

          與普通函數(shù)相比,區(qū)別如下

          (1)構(gòu)造函數(shù)只能由new關(guān)鍵字調(diào)用

          (2)構(gòu)造函數(shù)可以創(chuàng)建實例化對象

          (3)構(gòu)造函數(shù)是類的標(biāo)志。

          100、請解釋一下 JavaScript和CSS阻塞。

          JavaScript的阻塞特性是所有瀏覽器在下載 JavaScript代碼的時候,會阻止其他一切活動,比如其他資源的下載,內(nèi)容的呈現(xiàn)等,直到 JavaScript代碼下載、解析、執(zhí)行完畢后才開始繼續(xù)并行下載其他資源并渲染內(nèi)容。

          為了提高用戶體驗,新一代瀏覽器都支持并行下載 JavaScript代碼,但是 JavaScript代碼的下載仍然會阻塞其他資源的下載(例如圖片、CSS文件等)。

          為了防止 JavaScript修改DOM樹,瀏覽器需要重新構(gòu)建DOM樹,所以就會阻塞其他資源的下載和渲染。

          嵌入的 JavaScript代碼會阻塞所有內(nèi)容的呈現(xiàn),而外部 JavaScript代碼只會阻塞其后內(nèi)容的顯示,兩種方式都會阻塞其后資源的下載。也就是說,外部腳本不會阻塞外部腳本的加載,但會阻塞外部腳本的執(zhí)行。

          CSS本來是可以并行加載的,但是當(dāng)CSS后面跟著嵌入的 JavaScript代碼的時候,該CSS就會阻塞后面資源的下載。

          而當(dāng)把嵌入的 JavaScript代碼放到CSS前面時,就不會出現(xiàn)阻塞的情況了(在IE6下CSS都會阻塞加載)。

          根本原因是因為瀏覽器會維持HTML中CSS和 JavaScript代碼的順序,樣式表必須在嵌入的 JavaScript代碼執(zhí)行前先加載、解析完。而嵌入的 JavaScript代碼會阻塞后面的資源加載,所以就會出現(xiàn)CSS阻塞資源加載的情況。

          推薦閱讀

          【前端面試題】01—42道常見的HTML5面試題(附答案)

          【前端面試題】02—59道CSS面試題(附答案)

          本文完~


          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲无码免费观看视频 | 女人19毛片A片久久19软件 | 亚洲免费免费在线观看 | 久热国产在线观看 | 蜜臀av无码精品一区二区三区 |