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 Array
,h1 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、金山軟體、百姓網等眾多知名使用者的認可。歡迎免費試用!