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