您好,登錄后才能下訂單哦!
常見的JavaScript面試問題都有哪些呢,針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
1.如何理解 JS 中的this關(guān)鍵字?
this表示當(dāng)前對象,this的指向是根據(jù)調(diào)用的上下文來決定的,默認(rèn)指向window對象。
全局環(huán)境:全局環(huán)境就是在里面,這里的this始終指向的是window對象。
局部環(huán)境:
1.在全局作用域下直接調(diào)用函數(shù),this指向window。
2.對象函數(shù)調(diào)用,哪個(gè)對象調(diào)用就指向哪個(gè)對象。
3.使用 new 實(shí)例化對象,在構(gòu)造函數(shù)中的this指向?qū)嵗瘜ο蟆?/p>
4.使用call或apply改變this的指向。
2. JavaScript 中的作用域(scope)是指什么?
在 JavaScript 中,每個(gè)函數(shù)都有自己的作用域。作用域基本上是變量以及如何通過名稱訪問這些變量的規(guī)則的集合。只有函數(shù)中的代碼才能訪問函數(shù)作用域內(nèi)的變量。
同一個(gè)作用域中的變量名必須是唯一的。一個(gè)作用域可以嵌套在另一個(gè)作用域內(nèi)。如果一個(gè)作用域嵌套在另一個(gè)作用域內(nèi),最內(nèi)部作用域內(nèi)的代碼可以訪問另一個(gè)作用域的變量。
3.什么是閉包
我第一次解釋閉包時(shí),我常說函數(shù)中的函數(shù);但是,它沒有正確地描述閉包的確切含義。
閉包是在另一個(gè)作用域內(nèi)創(chuàng)建一個(gè)封閉的詞法范圍。它通常會自動返回來生成這個(gè)詞法環(huán)境。這個(gè)環(huán)境由創(chuàng)建閉包時(shí)在作用域內(nèi)的任何局部變量組成。它就像一個(gè)微型工廠,用這些原料生產(chǎn)出具有特定功能的產(chǎn)品。
4. 解釋 JavaScript 中的相等性。
JavaScript 中有嚴(yán)格比較和類型轉(zhuǎn)換比較:
嚴(yán)格比較(例如 ===)在不允許強(qiáng)制轉(zhuǎn)型的情況下檢查兩個(gè)值是否相等;
抽象比較(例如 ==)在允許強(qiáng)制轉(zhuǎn)型的情況下檢查兩個(gè)值是否相等。
var a = "42";
var b = 42;
a == b; // true
a === b; // false
復(fù)制代碼如果被比較的任何一個(gè)值可能是 true 或 false,要用 ===,而不是 ==;
如果被比較的任何一個(gè)值是這些特定值(0、“”或 []),要用 ===,而不是 ==;
在其他情況下,可以安全地使用 ==。它不僅安全,而且在很多情況下,它可以簡化代碼,并且提升代碼可讀性。
5. 解釋一下變量的提升
變量的提升是JavaScript的默認(rèn)行為,這意味著將所有變量聲明移動到當(dāng)前作用域的頂部,并且可以在聲明之前使用變量。初始化不會被提升,提升僅作用于變量的聲明。
var x = 1
console.log(x + '——' + y) // 1——undefined
var y = 2
6.如何理解事件委托
在DOM樹上綁定事件監(jiān)聽器并使用JS事件處理程序是處理客戶端事件響應(yīng)的典型方法。從理論上講,我們可以將監(jiān)聽器附加到HTML中的任何DOM元素,但由于事件委派,這樣做是浪費(fèi)而且沒必要的。
什么是事件委托?
這是一種讓父元素上的事件監(jiān)聽器也影響子元素的技巧。通常,事件傳播(捕獲和冒泡)允許我們實(shí)現(xiàn)事件委托。冒泡意味著當(dāng)觸發(fā)子元素(目標(biāo))時(shí),也可以逐層觸發(fā)該子元素的父元素,直到它碰到DOM綁定的原始監(jiān)聽器(當(dāng)前目標(biāo))。捕獲屬性將事件階段轉(zhuǎn)換為捕獲階段,讓事件下移到元素; 因此,觸發(fā)方向與冒泡階段相反。捕獲的默認(rèn)值為false。
7.解釋一下嚴(yán)格模式(strict mode)
嚴(yán)格模式用于標(biāo)準(zhǔn)化正常的JavaScript語義。嚴(yán)格模式可以嵌入到非嚴(yán)格模式中,關(guān)鍵字 ‘use strict’。使用嚴(yán)格模式后的代碼應(yīng)遵循JS嚴(yán)格的語法規(guī)則。例如,分號在每個(gè)語句聲明之后使用。
8.解釋 JavaScript 中的 null 和 undefined。
JavaScript 中有兩種底層類型:null 和 undefined。它們代表了不同的含義:尚未初始化:undefined;空值:null。
//null和undefined是兩個(gè)不同的對象
null == null //true
null === null //true
null == undefined //true
null === undefined //flase
9.解釋 JavaScript 中的值和類型。
JavaScript提供兩種數(shù)據(jù)類型: 基本數(shù)據(jù)類型和引用數(shù)據(jù)類型 基本數(shù)據(jù)類型有:
String
Number
Boolean
Null
Undefined
Symbol
引用數(shù)據(jù)類型有:
Object
Array
Function
10.解釋事件冒泡以及如何阻止它?
事件冒泡是指嵌套最深的元素觸發(fā)一個(gè)事件,然后這個(gè)事件順著嵌套順序在父元素上觸發(fā)。防止事件冒泡的一種方法是使用 event.cancelBubble 或 event.stopPropagation()(低于 IE 9)。
11.window.onload的作用?
window.onload是等文檔和資源都加載完成后調(diào)用的事件,保證js獲取元素 的時(shí)候,已經(jīng)加載。
12.說說你對作用域鏈的理解?
作用域鏈?zhǔn)莏s中的一種查找機(jī)制,從當(dāng)前作用域查找,當(dāng)前作用域沒有往上一級作用域查找,一直到最外層,如果都找不到則是is not define。
13.定時(shí)器的分類?他們的區(qū)別及用法是什么?
Js中有兩種定時(shí)器:setInterval:間歇執(zhí)行,setTimeout:延遲執(zhí)行
setInterval(函數(shù),時(shí)間) 時(shí)間單位ms,
語法:setInterval(function(){},1000); 隔一秒執(zhí)行函數(shù)一次
一般用于倒計(jì)時(shí),輪播圖
setTimeout(函數(shù),時(shí)間) 時(shí)間單位ms,
語法:setTimeout(function(){},1000); 延遲一秒執(zhí)行函數(shù)一次,只會執(zhí)行一次
一般用于廣告,廣告彈出層
14.把下面的字符串去重,并去除掉特殊字符按照數(shù)字在前字母在后的順序排序字符串
如下:“1233fddfd&3434fdsaff&454545&4545444rfdsfds&545gdsgs”
var str = “1233fddfd&3434fdsaff&454545&4545444rfdsfds&545gdsgs”;
var n = “”;
var s="";
for(var i=0;i
if((str[i]>=0&&str[i]<=9)&&n.indexof(str[i])==-1){ else="">=97&&str.charCodeAt(i)<=122)&&s.indexOf(str[i]) == -1){ s+=str[i]; } } console.log(n+s); //12345fdsarg 15.截取字符串“abcdefg”中的def。
var str = “abcdefg”;
if(str.indexOf(“def”)!=-1){
console.log(str.substr(str.indexOf(“def”),3));
}
16.數(shù)組方法pop() push() unshift() shift()?
push:在數(shù)組末尾添加一個(gè)或多個(gè)元素,返回當(dāng)前數(shù)組下標(biāo)。
Pop:在數(shù)組末尾刪除一個(gè)元素,返回被刪除的元素。
unshift:在數(shù)組的頭部添加或刪除元素,返回當(dāng)前數(shù)組下標(biāo)。
shift:在數(shù)組頭部刪除一個(gè)元素,返回被刪除的元素。
17.split() join() 的區(qū)別?
split是字符串的方法,將字符串按照特定標(biāo)志分割成數(shù)組。
例:“u&s”.split(“&”) ------ [“u”,”s”] Join:是數(shù)組方法,將數(shù)組按標(biāo)志組合成字符串 [“u”,”s”].join(“-”)–‘u-s’。
18.編寫一個(gè)數(shù)組去重的方法。
function sort(arr) {
for(var i = 0;i
for(var j = i+1;j
if(arr[i] == arr[j]){
arr.splice(j,1);
j–; //刪除一個(gè)元素后,后面的元素會依次往前,下標(biāo)也需要依次往前
}
}
}
return arr
}
19.冒泡算法排序?
for(var i = 0;i
for(var j = 0;j
if(arr[j] > arr[j+1]){ //
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
20.DOM怎樣添加、移除、移動、復(fù)制、創(chuàng)建和查找節(jié)點(diǎn)
獲取子節(jié)點(diǎn)
父節(jié)點(diǎn).children
父節(jié)點(diǎn).childNodes
獲取父節(jié)點(diǎn)
子節(jié)點(diǎn).parentNode
子節(jié)點(diǎn).offsetParent
創(chuàng)建
document.createElement(‘標(biāo)簽名’)
document.createTextNode(‘文本內(nèi)容’)
添加
父節(jié)點(diǎn).appendChild(子節(jié)點(diǎn))
父節(jié)點(diǎn).insertBefore(newChild,refChild)
復(fù)制
被復(fù)制的節(jié)點(diǎn).cloneNode(true)
刪除:
節(jié)點(diǎn).remove()
父節(jié)點(diǎn).removeChild(子節(jié)點(diǎn))
替換
父節(jié)點(diǎn).replaceChild(newChild,refChild)
21.什么是window對象? 什么是document對象?
window是js中最大的對象,表示窗口,包含document。
document文檔對象,表示HTML。
22.offsetWidth、clientWidth、scrollTop的區(qū)別?
offsetWidth:占位寬,包含 內(nèi)容寬+左右padding+左右border。
clientWidth:可視寬,包含 內(nèi)容寬+左右padding。
scrollTop:頁面被卷去的高。
23.如何獲取url地址中搜索內(nèi)容?
window.location.search
24.事件、IE與火狐的事件機(jī)制有什么區(qū)別?
IE的事件流是冒泡流,而火狐同時(shí)支持冒泡流和捕獲流。
25.事件綁定和普通事件有什么區(qū)別。
標(biāo)簽.事件:如果給同一個(gè)元素添加同一個(gè)事件,后面的會覆蓋前面 事件綁定:可以給同一個(gè)元素添加同一個(gè)事件,不會被覆蓋。
26.解釋一下事件流?
事件捕獲階段:當(dāng)事件發(fā)生的時(shí)候,將事件從window依次往子元素傳遞 確定目標(biāo)階段:確定事件目標(biāo) 事件冒泡階段:事件目標(biāo)開始處理事件,處理完以后會將事件依次傳遞給父元素,一直到window 事件都是在事件冒泡處理,ie只有冒泡。
27.拖拽效果中有幾種事件?
按下onmousedown,拖拽onmousemove,彈起onmouseup。
28.cookie的利弊?
優(yōu)點(diǎn):極高的擴(kuò)展性和可用性
1.通過良好的編程,控制保存在cookie中的session對象的大小。
2.通過加密和安全傳輸技術(shù)(SSL),減少cookie被破解的可能性。
3.只在cookie中存放不敏感數(shù)據(jù),即使被盜也不會有重大損失。
4.控制cookie的生命期,使之不會永遠(yuǎn)有效。偷盜者很可能拿到一個(gè)過期的cookie。
缺點(diǎn):
1.Cookie數(shù)量和長度的限制。每個(gè)domain最多只能有20條cookie,每個(gè)cookie長度不能超過4KB,否則會被截掉。
2.安全性問題。如果cookie被人攔截了,那人就可以取得所有的session信息。即使加密也與事無補(bǔ),因?yàn)閿r截者并不需要知道cookie的意義,他只要原樣轉(zhuǎn)發(fā)cookie就可以達(dá)到目的了。
3.有些狀態(tài)不可能保存在客戶端。例如,為了防止重復(fù)提交表單,我們需要在服務(wù)器端保存一個(gè)計(jì)數(shù)器。如果我們把這個(gè)計(jì)數(shù)器保存在客戶端,那么它起不到任何作用。
因?yàn)檫@些弊端(主要是cookie的大小和多少都受限制,并且每次你請求一個(gè)新的頁面的時(shí)候Cookie都會被發(fā)送過去,這樣無形中浪費(fèi)了帶寬,另外cookie還需要指定作用域,不可以跨域調(diào)用),IE8以后,就出現(xiàn)一個(gè)web storage;它僅僅是為了本地緩存數(shù)據(jù)而存在;但是Cookie也是不可以或缺的:Cookie的作用是與服務(wù)器進(jìn)行交互,作為HTTP規(guī)范的一部分而存在。
29.call()和apply()的區(qū)別和作用?
都是用來改變this的指向,在傳值的過程中會有些區(qū)別:
call(this的指向,參數(shù)1,參數(shù)2…)
apply(this的指向,[參數(shù)1,參數(shù)2…])
30.創(chuàng)建ajax的過程。
function ajax(json) {
json.data = json.data||""; //如果沒有請求參數(shù),為空
json.contentType = json.contentType || “application/x-www-form-urlencoded”; //如果沒有字符編碼,用默認(rèn)的
//1.創(chuàng)建對象
if(window.XMLHttpRequest){ //正常
var ajax = new XMLHttpRequest();
}else { //兼容ie6
var ajax = new ActiveXObject(“Microsoft.XMLHTTP”);
}
//2.建立連接
if(json.type.toUpperCase() ==“get”.toUpperCase()){
ajax.open(“GET”,json.url+"?"+json.data,true);
//3.發(fā)送請求
ajax.send();
}else {
ajax.open(“POST”,json.url,true);
//3.設(shè)置請求頭 ajax.setRequestHeader(“Content-type”,json.contentType+";charset=utf-8");
//4.發(fā)送請求
ajax.send(json.data);
}
//4.監(jiān)聽結(jié)果
ajax.onreadystatechange = function () {
if(ajax.readyState == 4){
if(ajax.status == 200){
json.success(ajax.response);
}
}
}
}
31.ajax請求的時(shí)候get 和post方式的區(qū)別,什么時(shí)候用post。
GET請求會將參數(shù)跟在URL后進(jìn)行傳遞,而POST請求則是作為HTTP消息的實(shí)體內(nèi)容發(fā)送給WEB服務(wù)器。當(dāng)然在Ajax請求中,這種區(qū)別對用戶是不可見的。
GEt傳輸數(shù)據(jù)容量小,不安全,post傳輸數(shù)據(jù)內(nèi)容大,更加安全;當(dāng)向服務(wù)器發(fā)送一些數(shù)據(jù)的時(shí)候選擇post比較安全。
32.ajax請求時(shí),如何解釋json數(shù)據(jù)。
如果是字符串形式的json:eval("("+ajax.response+")")。
如果是本地的json文件:JSON.parse(data)。
33.同步和異步的區(qū)別?
異步:客戶端與服務(wù)器請求數(shù)據(jù)的過程中,可以做其他的事情。
同步:客戶端與服務(wù)器請求數(shù)據(jù)的過程中,不能做其他的事情。
34.常見的http狀態(tài)碼?
不需要知道全部,常見的就可以,比如200 404 503。
200狀態(tài)碼:表示請求已成功,請求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回。
201狀態(tài)碼:表示請求成功并且服務(wù)器創(chuàng)建了新的資源,且其 URI 已經(jīng)隨Location 頭信息返回。假如需要的資源無法及時(shí)建立的話,應(yīng)當(dāng)返回 ‘202 Accepted’。
202狀態(tài)碼:服務(wù)器已接受請求,但尚未處理。
301狀態(tài)碼:被請求的資源已永久移動到新位置。服務(wù)器返回此響應(yīng)(對 GET 或 HEAD 請求的響應(yīng))時(shí),會自動將請求者轉(zhuǎn)到新位置。
302狀態(tài)碼:請求的資源臨時(shí)從不同的URI響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請求。
304自從上次請求后,請求的網(wǎng)頁未修改過。服務(wù)器返回此響應(yīng)時(shí),不會返回網(wǎng)頁內(nèi)容。如果網(wǎng)頁自請求者上次請求后再也沒有更改過,您應(yīng)將服務(wù)器配置為返回此響應(yīng)(稱為 If-Modified-Since HTTP 標(biāo)頭)。
301狀態(tài)碼:被請求的資源已永久移動到新位置。服務(wù)器返回此響應(yīng)(對 GET 或 HEAD 請求的響應(yīng))時(shí),會自動將請求者轉(zhuǎn)到新位置。
302狀態(tài)碼:請求的資源臨時(shí)從不同的URI響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請求 304自從上次請求后,請求的網(wǎng)頁未修改過。服務(wù)器返回此響應(yīng)時(shí),不會返回網(wǎng)頁內(nèi)容。如果網(wǎng)頁自請求者上次請求后再也沒有更改過,您應(yīng)將服務(wù)器配置為返回此響應(yīng)(稱為 If-Modified-Since HTTP 標(biāo)頭)。
401狀態(tài)碼:請求要求身份驗(yàn)證。對于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)。
403狀態(tài)碼:服務(wù)器已經(jīng)理解請求,但是拒絕執(zhí)行它。與401響應(yīng)不同的是,身份驗(yàn)證并不能提供任何幫助,而且這個(gè)請求也不應(yīng)該被重復(fù)提交。
404狀態(tài)碼:請求失敗,請求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。沒有信息能夠告訴用戶這個(gè)狀況到底是暫時(shí)的還是永久的。假如服務(wù)器知道情況的話,應(yīng)當(dāng)使用410狀態(tài)碼來告知舊資源因?yàn)槟承﹥?nèi)部的配置機(jī)制問題,已經(jīng)永久的不可用,而且沒有任何可以跳轉(zhuǎn)的地址。404這個(gè)狀態(tài)碼被廣泛應(yīng)用于當(dāng)服務(wù)器不想揭示到底為何請求被拒絕或者沒有其他適合的響應(yīng)可用的情況下。
500狀態(tài)碼:服務(wù)器遇到了一個(gè)未曾預(yù)料的狀況,導(dǎo)致了它無法完成對請求的處理。一般來說,這個(gè)問題都會在服務(wù)器的程序碼出錯時(shí)出現(xiàn)。
503狀態(tài)碼:由于臨時(shí)的服務(wù)器維護(hù)或者過載,服務(wù)器當(dāng)前無法處理請求。通常,這個(gè)是暫時(shí)狀態(tài),一段時(shí)間會恢復(fù)。
35.js哪些操作會造成內(nèi)存泄露?
1)意外的全局變量引起的內(nèi)存泄露 function leak(){ leak=“xxx”;//leak成為一個(gè)全局變量,不會被回收 }。
2)被遺忘的定時(shí)器或者回調(diào)。
3)閉包引起的內(nèi)存泄漏。
36.$(document).ready() 方法和window.onload 有什么區(qū)別?
window.onload與ready的區(qū)別
1.window.onload會覆蓋之前的ready的區(qū)別,不會覆蓋,會疊加。
2.window.onload等文檔和資源都加載完成以后調(diào)用ready只要文檔加載完成以后就會調(diào)用。
37.怎么解決跨域問題?
通過jsonp解決跨域,即通過script標(biāo)簽的src屬性引入一個(gè)js文件,通過回調(diào)函數(shù)將數(shù)據(jù)返回 KaTeX parse error: Expected 'EOF', got '&' at position 34: …script src=’url&?callback=showDa….ajax()方法中,只需配置一個(gè)dataType:‘jsonp’,就可以發(fā)起一個(gè)跨域請求。
關(guān)于常見的JavaScript面試問題都有哪些呢問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。