50道常見的js面試題
- 2019 年 11 月 1 日
- 筆記
分享50道js的面試題
1.javascript的typeof返回哪些數據類型
string, boolean, number, undefined, function, object
2.例舉3種強制類型轉換和2種隱式類型轉換?
強制(parseInt, parseFloat, number
) 隱式(== === + -
)
3.split() 和 join() 的區別
split()
是將字元串切割成數組的形式,join()
是將數組轉換成字元串。
4.數組方法pop()、push()、unshift()、shift()
push()
尾部添加pop()
尾部刪除unshift()
頭部添加shift()
頭部刪除
5.IE和標準下有哪些兼容性的寫法
var ev = ev || window.event document.documentElement.clientWidth || document.body.clientWidth Var target = ev.srcElement||ev.target
6.ajax請求的時候get 和 post方式的區別
get
是在url
後面post
放在虛擬載體裡面get
有大小限制(只能提交少量參數)post
比get
安全- 應用不同,請求數據和提交數據
7.call 和 apply 的區別
Object.call(this, obj1, obj2, obj3) Object.apply(this, arguments)
apply
和call
的唯一區別是第二個參數
的傳遞方式不同,apply
的第二個參數必須是一個數組
,而call
允許傳遞一個參數列表
。
8.ajax請求時,如何解析json數據
使用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(); //通過元素的Name屬性的值 getElementsByName(); //通過元素Id,唯一性 getElementById();
14.解釋jsonp的原理,以及為什麼不是真正的 ajax
動態創建script
標籤,回調函數
Ajax
是頁面無刷新請求數據操作
15.document load 和document ready的區別
document.onload
是在結構和樣式,外部js
以及圖片載入完才執行js
document.ready
是 dom
樹創建完成就執行的方法,原生中沒有這個方法,jquery
中有 $().ready(function)
16.」==」和「===」的不同
==
會自動轉換類型,再判斷是否相等
===
不會自動類型轉換,直接去比較
17.函數聲明與函數表達式的區別?
在Javscript
中,解析器在向執行環境中載入數據時,對函數聲明和函數表達式並非是一視同仁的,解析器會率先讀取函數聲明,並使其在執行任何程式碼之前可用(可以訪問),至於函數表達式,則必須等到解析器執行到它所在的程式碼行,才會真正被解析執行。
18.對作用域上下文和this的理解,看下列程式碼:
var User = { count: 1, getCount: function() { return this.count; } }; console.log(User.getCount()); // 1 var func = User.getCount; console.log(func()); // 是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 οnclick="box()"></button>
21.Javascript的事件流模型都有什麼?
「事件冒泡」
:事件開始由最具體的元素接受,然後逐級向上傳播「事件捕捉」
:事件由最不具體的節點先接收,然後逐級向下,一直到最具體的「DOM事件流」
:三個階段:事件捕捉,目標階段,事件冒泡
22.看下列程式碼,輸出什麼?解釋原因。
var a = null; alert(typeof a); // object
解釋:JavaScript
誕生以來便如此,null
是一個只有一個值的數據類型,這個值就是null
。表示一個空指針對象,所以用typeof
檢測會返回」object」
。
23.判斷字元串以字母開頭,後面可以是數字,下劃線,字母,長度為6-30
var reg=/^[a-zA-Z]w{5,29}$/;
24.回答以下程式碼,alert的值分別是多少?
var a = 100; function test() { alert(a); a = 10; //去掉了var 就變成定義了全局變數了 alert(a); } test(); alert(a); // 正確答案是: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.不使用循環,創建一個長度為100的數組,並且每個元素的值等於它的小標。
new Array(100).fill(0).map((_, c) => c)
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(原型鏈)向上尋找,如果最終沒有找到,則該屬性值為undefined
;如果最終找到該屬性的值,則返回結果。與這個過程不同的是,當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{ }
40.Ajax原理
// (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種彈出式消息提醒(警告窗口,確認窗口,資訊輸入窗口)的命令式什麼?
- alert
- confirm
- prompt
43.以下程式碼執行結果
var uname = 'jack' function change() { alert(uname) // undefined var uname = 'lily' alert(uname) // lily } change(); // 變數聲明提前問題
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.offsetWidthoffsetHeight和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; } } }