50道JS面試題
1. javascript的typeof返回哪些資料類型.
答案:string,boolean,number,undefined,function,object
2. 例舉3種強制型別轉換和2種隱式型別轉換?
答案:強制(parseInt,parseFloat,number)隱式(== ===)
3. split() join() 的區別
答案:前者是將字串切割成陣列的形式,後者是將陣列轉換成字元串
4. 陣列方法pop() push() unshift() shift()
答案:push()尾部新增 pop()尾部刪除unshift()頭部新增 shift()頭部刪除
5. IE和標準下有哪些相容性的寫法
答案:
var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidthVar target = ev.srcElement||ev.target
6. ajax請求的時候get 和post方式的區別
答案:
一個在url後面 ,一個放在虛擬載體裡面get有大小限制(只能提交少量引數)安全問題應用不同 ,請求資料和提交資料
7. call和apply的區別
答案:
Object.call(this,obj1,obj2,obj3)Object.apply(this,arguments)
8. ajax請求時,如何
答案:使用JSON.parse
9. 事件委託是什麼
答案: 利用事件冒泡的原理,讓自己的所觸發的事件,讓他的父元素代替執行!
10. 閉包是什麼,有什麼特性,對頁面有什麼影響
答案:閉包就是能夠讀取其他函式內部變數的函式,使得函式不被GC回收,如果過多使用閉包,容易導致記憶體洩露
11. 如何阻止事件冒泡
答案:ie:阻止冒泡ev.cancelBubble = true;非IE ev.stopPropagation();
12. 如何阻止預設事件
答案:(1)return false;(2) ev.preventDefault();
13. 新增 刪除 替換 插入到某個接點的方法
答案:
1)建立新節點 createElement() //建立一個具體的元素 createTextNode() //建立一個文字節點 2)新增、移除、替換、插入 appendChild() //新增 removeChild() //移除 replaceChild() //替換 insertBefore() //插入 3)查詢 getElementsByTagName() //通過標籤名稱 getElementsByName() //通過元素的Name屬性的值 getElementById() //通過元素Id,唯一性
14. 解釋jsonp的原理,以及為什麼不是真正的ajax
答案:動態建立script標籤,回撥函式Ajax是頁面無重新整理請求資料操作
15. document load 和document ready的區別
答案:document.onload 是在結構和樣式,外部js以及圖片載入完才執行jsdocument.ready是dom樹建立完成就執行的方法,原生種沒有這個方法,jquery中有 $().ready(function)
16. ”==”和“===”的不同
答案:前者會自動轉換型別,再判斷是否相等後者不會自動型別轉換,直接去比較
17. 函式宣告與函式表示式的區別?
在Javscript中,解析器在向執行環境中載入資料時,對函式宣告和函式表示式並非是一視同仁的,解析器會率先讀取函式宣告,並使其在執行任何程式碼之前可用(可以訪問),至於函式表示式,則必須等到解析器執行到它所在的程式碼行,才會真正被解析執行。
18. 對作用域上下文和this的理解,看下列程式碼:
var User = {
count: 1,
getCount: function() {
return this.count;
}
};
console.log(User.getCount()); // what?
var func = User.getCount;
console.log(func()); // what?
問兩處console輸出什麼?為什麼?
答案:是1和undefined。
func是在window的上下文中被執行的,所以不會訪問到count屬性。
19. 看下面程式碼,給出輸出結果。
for(var i = 1; i <= 3; i++){ //建議使用let 可正常輸出i的值
setTimeout(function(){
console.log(i);
},0);
};
答案:4 4 4。
原因:Javascript事件處理器線上程空閒之前不會執行。
20. 當一個DOM節點被點選時候,我們希望能夠執行一個函式,應該怎麼做?
box.onlick= function(){}
box.addEventListener("click",function(){},false);
<button onclick="xxx()"></button>
21. Javascript的事件流模型都有什麼?
“事件冒泡”:事件開始由最具體的元素接受,然後逐級向上傳播
“事件捕捉”:事件由最不具體的節點先接收,然後逐級向下,一直到最具體的
“DOM事件流”:三個階段:事件捕捉,目標階段,事件冒泡
22. 看下列程式碼,輸出什麼?解釋原因。
var a = null;
alert(typeof a);
答案:object
解釋:null是一個只有一個值的資料型別,這個值就是null。表示一個空指標物件,所以用typeof檢測會返回”object”。
23. 判斷字串以字母開頭,後面可以是數字,下劃線,字母,長度為6-30
var reg=/^[a-zA-Z]\w{5,29}$/;
24. 回答以下程式碼,alert的值分別是多少?
<script>
var a = 100;
function test(){
alert(a);
a = 10; //去掉了var 就變成定義了全域性變量了
alert(a);
}
test();
alert(a);
</script>
正確答案是: 100, 10, 10
25. javaScript的2種變數範圍有什麼不同?
全域性變數:當前頁面內有效
區域性變數:函式方法內有效
26. null和undefined的區別?
null是一個表示"無"的物件,轉為數值時為0;undefined是一個表示"無"的原始值,轉為數值時為NaN。
當宣告的變數還未被初始化時,變數的預設值為undefined。 null用來表示尚未存在的物件
undefined表示"缺少值",就是此處應該有一個值,但是還沒有定義。典型用法是:
(1)變數被聲明瞭,但沒有賦值時,就等於undefined。
(2)呼叫函式時,應該提供的引數沒有提供,該引數等於undefined。
(3)物件沒有賦值的屬性,該屬性的值為undefined。
(4)函式沒有返回值時,預設返回undefined。
null表示"沒有物件",即該處不應該有值。典型用法是:
(1)作為函式的引數,表示該函式的引數不是物件。
(2)作為物件原型鏈的終點。
27. new操作符具體幹了什麼呢?
1、建立一個空物件,並且 this 變數引用該物件,同時還繼承了該函式的原型。
2、屬性和方法被加入到 this 引用的物件中。
3、新建立的物件由 this 所引用,並且最後隱式的返回 this 。
28. js延遲載入的方式有哪些?
defer和async、動態建立DOM方式(建立script,插入到DOM中,載入完畢後callBack)、按需非同步載入js
29. Flash、Ajax各自的優缺點,在使用中如何取捨?
Flash ajax對比
(1)Flash適合處理多媒體、向量圖形、訪問機器;對CSS、處理文字上不足,不容易被搜尋。
(2)ajax對CSS、文字支援很好,支援搜尋;多媒體、向量圖形、機器訪問不足。
共同點:與伺服器的無重新整理傳遞訊息、使用者離線和線上狀態、操作DOM
30. 寫一個獲取非行間樣式的函式
function getStyle(obj,attr) {
if(obj.currentStyle) {
return obj.currentStyle[attr];
}else{
getComputedStyle(obi,false)[attr]
}
}
31. 希望獲取到頁面中所有的checkbox怎麼做?(不使用第三方框架)
var inputs = document.getElementsByTagName("input");//獲取所有的input標籤物件 var checkboxArray = [];//初始化空陣列,用來存放checkbox物件。 for(var i=0;i<inputs.length;i++){ var obj = inputs[i]; if(obj.type=='checkbox'){ checkboxArray.push(obj); } }
32. 寫一個function,清除字串前後的空格。(相容所有瀏覽器)
String.prototype.trim= function(){
return this.replace(/^\s+/,"").replace(/\s+$/,"");
}
33. javascript語言特性中,有很多方面和我們接觸的其他程式語言不太一樣,請舉例
javascript語言實現繼承機制的核心就是 1 (原型),而不是Java語言那樣的類式繼承。Javascript解析引擎在讀取一個Object的屬性的值時,會沿著2(原型鏈)向上尋找,如果最終沒有找到,則該屬性值為 3undefined;如果最終找到該屬性的值,則返回結果。與這個過程不同的是,當javascript解析引擎執行“給一個Object的某個屬性賦值”的時候,如果當前Object存在該屬性,則改寫該屬性的值,如果當前的Object本身並不存在該屬性,則賦值該屬性的值。
34. Cookie在客戶機上是如何儲存的
Cookies就是伺服器暫存放在你的電腦裡的文字檔案,好讓伺服器用來辨認你的計算機。當你在瀏覽網站的時候,Web伺服器會先送一小小資料放在你的計算機上,Cookies 會幫你在網站上所打的文字或是一些選擇都記錄下來。當下次你再訪問同一個網站,Web伺服器會先看看有沒有它上次留下的Cookies資料,有的話,就會依據Cookie裡的內容來判斷使用者,送出特定的網頁內容給你。
35. 如何獲取javascript三個數中的最大值和最小值?
Math.max(a,b,c);//最大值
Math.min(a,b,c)//最小值
36. javascript是面向物件的,怎麼體現javascript的繼承關係?
使用prototype原型來實現。
37. .form中的input可以設定為readonly和disable,請問2者有什麼區別?
readonly不可編輯,但可以選擇和複製;值可以傳遞到後臺disabled不能編輯,不能複製,不能選擇;值不可以傳遞到後臺
38. 列舉javaScript的3種主要資料型別,2種複合資料型別和2種特殊資料型別。
主要資料型別:string, boolean, number
複合資料型別:function, object
特殊型別:undefined,null
39. 程式中捕獲異常的方法?
try{
}catch(e){
}finally{
}
(1)建立物件
var xhr = new XMLHttpRequest();
(2)開啟請求
xhr.open('GET', 'example.txt', true);
(3)傳送請求
xhr.send(); 傳送請求到伺服器
(4)接收響應
xhr.onreadystatechange =function(){}
(1)當readystate值從一個值變為另一個值時,都會觸發readystatechange事件。
(2)當readystate==4時,表示已經接收到全部響應資料。
(3)當status ==200時,表示伺服器成功返回頁面和資料。
(4)如果(2)和(3)內容同時滿足,則可以通過xhr.responseText,獲得伺服器返回的內容。
41. 解釋什麼是Json:
(1)JSON 是一種輕量級的資料交換格式。
(2)JSON 獨立於語言和平臺,JSON 解析器和 JSON 庫支援許多不同的程式語言。
(3)JSON的語法表示三種類型值,簡單值(字串,數值,布林值,null),陣列,物件
42. js中的3種彈出式訊息提醒(警告視窗,確認視窗,資訊輸入視窗)的命令式什麼?
alertconfirmprompt
43. 以下程式碼執行結果
var uname = 'jack'
function change() {
alert(uname) // ?
var uname = 'lily'
alert(uname) //?
}
change()
分別alert出 undefined,lily,(變數宣告提前問題)
44. 瀏覽器的滾動距離:
可視區域距離頁面頂部的距離
scrollTop=document.documentElement.scrollTop||document.body.scrollTop
45. 可視區的大小:
(1)innerXXX(不相容ie)
window.innerHeight 可視區高度,包含滾動條寬度
window.innerWidth 可視區寬度,包含滾動條寬度
(2)document.documentElement.clientXXX(相容ie)
document.documentElement.clientWidth可視區寬度,不包含滾動條寬度
document.documentElement.clientHeight可視區高度,不包含滾動條寬度
46. 節點的種類有幾種,分別是什麼?
(1)元素節點:nodeType ===1;
(2)文字節點:nodeType ===3;
(3)屬性節點:nodeType ===2;
47. innerHTML和outerHTML的區別
innerHTML(元素內包含的內容)
outerHTML(自己以及元素內的內容)
48. offsetWidth offsetHeight和clientWidth clientHeight的區別
(1)offsetWidth (content寬度+padding寬度+border寬度)
(2)offsetHeight(content高度+padding高度+border高度)
(3)clientWidth(content寬度+padding寬度)
(4)clientHeight(content高度+padding高度)
49. 閉包的好處
(1)希望一個變數長期駐紮在記憶體當中(不被垃圾回收機制回收)
(2)避免全域性變數的汙染
(3)私有成員的存在
(4)安全性提高
50. 氣泡排序演算法
氣泡排序
var array = [5, 4, 3, 2, 1];
var temp = 0;
for (var i = 0; i <array.length; i++){
for (var j = 0; j <array.length - i; j++){
if (array[j] > array[j + 1]){
temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}