前端面试(我的收藏总结)HTML篇javascript
前端面试(我的收藏总结)CSS篇html
undefined
, null
, boolean
, string
, number
java
Ps:ES6中新增symbol
类型git
参考:JavaScript的数据类型及其检测github
值类型面试
引用类型ajax
参考:低门槛完全理解JavaScript中的深拷贝和浅拷贝api
undefind、string、number、boolean、function、object数组
特别说明的是对象、数组、null都是object(函数虽是引用类型,但能识别),由于typeof无法区分引用类型
Ps:能够获得ES6中新增的symbol
类型
能够用instanceof
关键字
举个栗子:
var arr = []
arr instanceof Array //true
Array.isArray(arr) //true
复制代码
双等会自动强制转换,有风险。
jQuery源码中推荐使用三等,我我的也是这么写的。双等可用于判断布尔值
//构造函数方式
function Animal { this.name = 'pig' }
function Animal2 { Animal.call(this); this.age = 18 }
console.log(new Animal2())
//缺点:没法继承Animal的原型对象
//原型链方式
function Animal { this.name = 'pig' }
function Animal2 { this.age = 18 }
Animal2.prototype = new Animal();
console.log(new Animal2())
//缺点:其实是共享,修改原型对象里的内容,其它继承的类也会同步修改
//组合方式
function Animal { this.name = 'pig' }
function Animal2 { Animal.call(this); this.age = 18 }
Animal2.prototype = Animal.prototype;
console.log(new Animal2())
//缺点:因为引用同一个原型对象,没法区分对象是由谁实例化的
//最终方式
function Animal { this.name = 'pig' }
function Animal2 { Animal.call(this); this.age = 18 }
Animal2.prototype = Obiect.create(Animal.prototype);
Animal2.prototype.constructor = Animal2;
console.log(new Animal2())
//解释:经过建立新的对象,再也不是同一个,再指定构造函数属性为本身
复制代码
字面量
object对象
构造函数
object create
建立空对象,并继承原型对象
执行构造函数,this指向这个空对象
若是返回值是object则返回新对象,不然返回object
在执行代码时,变量和函数的声明会被提高到做用域的顶部(此时变量的值为undefined)
若是是全局,会被提高到脚本的最前面
若是是函数内,会被提高到函数内最前面,this也是
PS:注意函数表达式(匿名函数)的状况
PS2:注意ES6中let
的状况,不会变量提高
做为构造函数执行
做为对象属性执行
做为普通函数执行
call
apply
bind
for(var i=0;i<10;i++){
(function(i){
var a = document.createElement('a');
a.innerHtml=i+'<br>';
a.onclick=function(e){
e.preventDefault();
alert(i)
}
document.body.appendChild(a)
})(i)
}
复制代码
只有函数做用域和全局做用域,ES6中新增块级做用域那是后话
函数外声明的变量为全局做用域,函数内可使用
函数内声明的变量为函数做用域,函数外不可使用
做用域链:一个自由变量一直往上寻找(定义时的)父级做用域内的变量的过程。
自由变量:当前做用域没有定义的变量
ps:花括号内使用let
声明变量为块级做用域,只能内部使用,减小全局污染
闭包:用一个函数去访问另外一个函数内的内部变量的方式的特殊函数
使用场景:柯里化函数
参考:mp.weixin.qq.com/s/G9HIJWH-5…
同步会阻塞代码执行,异步不会
定时任务:setTimeout
setInverval
网络请求:ajax请求,动态加载
事件绑定
参考:www.dailichun.com/2018/01/21/…
var random = Math.random();
var random = random+'00000000';
var random = random.slice(0,10);
复制代码
function foreach(obj,fn){
var key;
if(obj instanceof Array){
obj.forEach(function(item,index){
fn(index,item)
})
}else{
for(key in obj){
fn(key,obj[key])
}
}
}
复制代码
Date.now()
new Date().getTime()
+new Date()