總結一些面試中容易錯的題(主要是我自己需要特別記憶的)
變數型別和計算
1、typeof console.log //function
2、何時用==何時用===
答:obj.a == null 相當於obj.a === null || obj.a === undefined
除了這裡用== 其他情況全用===
3、js中有哪些內建函式 --- 資料封裝類物件
Object、Array、Boolean、Number、String、Function、Date、RegExp、Error
4、如何理解JSON?
JSON 也不過是一個JS物件而已,但是JSON裡不能有函式。
原型和原型鏈
obj.__proto__ === Object.prototype
5、如何準確判斷一個變數是陣列?
var arr = [];
(1) arr instanceof Array //true;
(2) Object.prototype.toString.call(arr) === '[object Array]';
(1)如果arr = {__proto__: Array.prototype}時,將判斷錯誤
6、寫一個原型鏈繼承的例子
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)
}
div1.html('<p>hello imooc</p>');
div1.on('click', function(){
alert('clicked')
})
7、描述new一個物件的過程
答:建立一個新物件-->this指向這個新物件-->執行程式碼,即對this賦值-->返回this
作用域作用域鏈和閉包
答:作為建構函式執行、作為物件屬性執行、作為普通函式執行、call/apply/bind
9、建立10個<a>標籤,點選時彈出對應序號
for(i=0;i<10;i++){
(function(i){
var a = document.createElement('a')
a.innerHTML = i + '<br>'
a.addEventListener('click', function(e){
e.preventDefault();
alert(i)
})
document.body.appendChild(a)
})(i)
}
10、如何理解作用域
自由變數、作用域鏈-即自由變數的查詢、閉包的兩個場景
11、實際開發中閉包的應用
閉包實際應用中主要用於封裝變數,收斂許可權
function isFirstLoad() {
var _list = [];
return function (id){
if(_list.indexOf(id) >=0 ) { return false }
else {
_list.push(id)
return true;
}
}
}
//使用
var firstLoad = isFirstLoad()
firstLoad(10) //true
firstLoad(10) //false
firstLoad(20) //true