1. 程式人生 > >JavaScript 常見面試題分析(一)

JavaScript 常見面試題分析(一)

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。

01 JavaSctipt 中使用 typeof 能得到的型別有哪些?

這道題考察的是 JS 的變數型別,JS 的變數型別有值型別和變數型別兩種,值型別包括 undefined、字串、數字、布林值,引用型別包括物件、陣列、函式

① null 是 object 物件,一個空的指標,並沒有指向任何真實的引用型別
② typeof 只能區分值型別的詳細型別
③ typeof 能區分函式

 

02 什麼時候使用 === 什麼時候使用 == ?

這道題考察的是強制型別轉換,而在 JS 當中,在進行字串拼接、== 運算子、if 語句、邏輯運算時會發生型別轉換

執行結果 1

 

 

判斷一個變數會被當做 ture 還是 false,可以用兩個 ! 進行判斷

 

在 jQuery 原始碼中,所有的 if 判斷,都是使用 ===,除了下面這種情況,這裡相當於 obj.a === null || obj.a ===undefined 的簡寫形式

if(obj.a == null) {
    ...
}

03 JS 中有哪些內建函式?

這道題考察的是資料封裝類物件,常見的內建函式有 Object, Array, Boolean, Number, String, Function, Date, RegExp, Error

04 JS 變數按照儲存方式區分為哪些型別?並描述其特點

// 值型別
var a = 100;
var b = a;
a = 200;
console.log(b) //100

// 引用型別
var a = {age:20};
var b = a;
b.age = 21;
console.log(a.age) //21

特點:值型別可以把數值分塊儲存在記憶體中;引用型別則是好幾個變數共用一個記憶體塊,它是一個變數指標的賦值,不是一個真正的拷貝

05 如何理解 JSON

JSON 是一個數據格式,也是一個 JS 物件,JSON 常用的兩個 API 如下

// 把物件轉換成字串
JSON.stringify({a:10, b:20}) 
// 把字串轉換成物件
JSON.parse('{"a":10, "b":20}') 

06 如何準確判斷一個變數是陣列型別?

執行結果

07 寫一個原型鏈繼承的例子

我們在這裡寫一個封裝 DOM 查詢的例子

function Elem(id) {
    this.elem = document.getElementById(id);
}
Elem.prototype.html = function(val){
    var elem = this.elem
    if(val){
        elem.innerHTML = val;
        return this; // 鏈式操作
    }else {
        return elem.innerHTML;
    }
}
Elem.prototype.on = function(type, fn){
    var elem = this.elem;
    elem.addEventListener(type, fn)
}

執行結果 1

執行結果 2

執行結果 3

08 描述 new 一個物件的過程

① 建立一個新物件;② this 指向這個新物件; ③ 執行程式碼,即對 this 賦值;④ 返回 this

function Human(name, age){
    this.name = name;
    this.age = age;
    this.food = 'niangao';
    // return this; // 預設有這一行 
}

var h1 = new Human('李澤言', 28);
var h2 = new Human('白起', 24);

09 判斷一個函式是否是一個變數的建構函式

instanceof 用於判斷引用型別屬於哪個建構函式的方法,也可以判斷一個變數是否為陣列:變數 instanceof Arrayh1 instanceof Human 的判斷邏輯是:h1__proto__ 一層一層往上,能否對應到 Human.prototype,也可以判斷 h1 instanceof Object,矩形為建構函式,圓角矩形為物件

原型鏈

執行結果

原型規則 ①:所有的引用型別(陣列、物件、函式)都具有物件特性,即可自由擴充套件屬性(除了 null 以外)

var obj = {}; obj.a = 100;
var arr = []; arr.a = 100;
function fn () {}; fn.a = 100;

原型規則 ②:所有的引用型別(陣列、物件、函式)都有一個 __proto__ 屬性(隱式原型),屬性值是一個普通的物件

執行結果

原型規則 ③:所有的函式,都有一個 prototype 屬性(顯式原型),屬性值也是一個普通的物件

執行結果

原型規則 ④:所有的引用型別(陣列、物件、函式),__proto__ 屬性值指向它的建構函式的 prototype 屬性值

執行結果

原型規則 ⑤:當試圖得到一個物件(引用型別)的某個屬性時,如果這個物件本身沒有這個屬性,那麼會去它的 __proto__(即它的建構函式 prototype)中尋找

需要注意的是,無論是函式自身的屬性,還是從原型中得到的屬性, this 永遠指向物件本身

function Human(name, age) {
    this.name = name;
}
Human.prototype.alertName = function() {
    alert(this.name)
}
var h = new Human('Nian糕')
h.printName = function() {
    console.log(this.name)
}
h.printName();
h.alertName();

執行結果

10 迴圈物件自身的屬性

var item
for (item in f) {
    // 高階瀏覽器已經在 for in 中遮蔽了來自原型的屬性
    // 但是這裡建議大家還是加上這個判斷,保證程式的健壯性
    if(f.hasOwnProperty(item)) {
        console.log(item)
    }
}

執行結果

End of File


行文過程中出現錯誤或不妥之處在所難免,希望大家能夠給予指正,以免誤導更多人,最後,如果你覺得我的文章寫的還不錯,希望能夠點一下喜歡關注,為了我能早日成為簡書優秀作者獻上一發助攻吧,謝謝!^ ^
連結:https://www.jianshu.com/p/3c21b6ec1a99

關於Fundebug

Fundebug專注於JavaScript、微信小程式、微信小遊戲、支付寶小程式、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了9億+錯誤事件,得到了Google、360、金山軟體、百姓網等眾多知名使用者的認可。歡迎免費試用!