总结一些面试中容易错的题(主要是我自己需要特别记忆的)
变量类型和计算
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