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 有大小限制(只能提交少量參數)
  • postget 安全
  • 應用不同,請求數據和提交數據

7.call 和 apply 的區別

Object.call(this, obj1, obj2, obj3) Object.apply(this, arguments)

applycall的唯一區別是第二個參數的傳遞方式不同,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.readydom 樹創建完成就執行的方法,原生中沒有這個方法,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是一個表示"無"的對象,轉為數值時為 0undefined是一個表示"無"的原始值,轉為數值時為NaN。當聲明的變數還未被初始化時,變數的默認值為undefinednull用來表示尚未存在的對象

undefined表示"缺少值",就是此處應該有一個值,但是還沒有定義。典型用法是:

  • 1、變數被聲明了,但沒有賦值時,就等於undefined
  • 2、調用函數時,應該提供的參數沒有提供,該參數等於undefined
  • 3、對象沒有賦值的屬性,該屬性的值為undefined
  • 4、函數沒有返回值時,默認返回undefined

null表示"沒有對象",即該處不應該有值。典型用法是:

  • 1、作為函數的參數,表示該函數的參數不是對象。
  • 2、作為對象原型鏈的終點。

27.new操作符具體幹了什麼呢?

  • 1、創建一個空對象,並且this 變數引用該對象,同時還繼承了該函數的原型。
  • 2、屬性和方法被加入到this 引用的對象中。
  • 3、新創建的對象由this 所引用,並且最後隱式的返回this 。

28.js延遲載入的方式有哪些?

  • deferasync
  • 動態創建 DOM 方式(創建script,插入到 DOM 中,載入完畢後callBack
  • 按需非同步載入js

29.Flash、Ajax各自的優缺點,在使用中如何取捨?

Flash ajax對比

  • 1、Flash適合處理多媒體、矢量圖形、訪問機器;對CSS、處理文本上不足,不容易被搜索。
  • 2、ajaxCSS、文本支援很好,支援搜索;多媒體、矢量圖形、機器訪問不足。

共同點:與伺服器的無刷新傳遞消息、用戶離線和在線狀態、操作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;          }      }  }