js面试合集
es6的新特性
promise的使用,怎么用es5实现promise
let aaa=function(a){ return new Promise((resolve,reject)=>{ if(a>10){ resolve('success') }else{ reject('error') } }) } aaa(11).then(res=>{ console.log(res) }).catch(error=>{ console.log(error) }) aaa(10).then(res=>{ console.log(res) }).catch(error=>{ console.log(error) }) //success //error
if有作用域吗
函数有函数作用域
而{}则有块级作用域(let const)
if
while
switch
for
等等都在let与const里有块作用域
原型链和作用域链
原型链:访问一个对象的属性时,会优先在对象本身上查找,若找不到,找到对象的属性_proto_上查找,即该对象的构造函数的prototype,如果找不到,会继续往上找,直到找到或者为undefined,一层一层找仿佛一条锁链 jiangxie
作用域链:这个一般指块级作用域和函数作用域以及全局的套娃,从当前作用域开始查找变脸,没找到往其上一级的作用域查找,直到找到或者到全局
js判断类型
1、typeof
检测不出null 和 数组,结果都为object,所以typeof常用于检测基本类型 2、instanceof
不能检测出number、boolean、string、undefined、null、symbol类型,所以instancof常用于检测复杂类型以及级成关系
3、constructor null、undefined没有construstor方法,因此constructor不能判断undefined和null。
但是contructor的指向是可以被改变,所以不安全
4、Object.prototype.toString.call
全类型都可以判断
7、普通函数和箭头函数的区别
1,this指向问题
普通函数的this指向分两种
a,实例化对象,这个时候的this指向的事这个构建出来的实例
b,其他普通函数,那么这个时候的this在于这个函数属于谁的,比如
function aaa(){ console.log(this) } aaa()//Window let ddd={ aaa } ddd.aaa()//ddd
箭头函数只有一种,因为箭头函数没有是个匿名函数,没有constructor,没办法实例化
而箭头函数的指向则是会捕获其所在的上下文的this值,作为自己的this值
var data={ aa:()=>{ console.log(this) }, bb(){ console.log(this) }, cc:{ dd:()=>{ console.log(this) }, ff(){ console.log(this) }, ee(){ this.dd() } } } data.aa()//window data.bb()//data data.cc.dd()//window data.cc.ff()//cc data.cc.ee()//window
注意:这里所指的上下文是指触发函数的这个函数的上下文环境,比如data.cc.dd() 和 data.cc.ee() 这些触发函数,而他的上下问环境是window
8,document.write和innerHTML的区别
document.write 将内容写入页面,清空替换掉原来的内容,会导致重绘
document.innerHTML 将内容写入某个Dom节点,不会重绘
栈和堆的区别
堆一般用来存放引用类型的的数据,可以随性所欲的增改删不用遵循次序,由程序员释放或者程序结束时OS回收
栈区则一般用来存储基础类型,存储方式遵循先进后出,由编译器自动分配释放
JS哪些操作会造成内存泄露
JSONP的工作原理,以及它为什么不是真正的AJAX
jsonp并不是正式的传输协议,而是script,script是没有同源限制的
但相应的它只能提供get请求,且需要服务端配置支持
关于JS事件冒泡与JS事件代理(事件委托)
1,事件冒泡
在元素触发事件时,会从当前元素一层一层的往父级传递事件,直到window为止,阻止冒泡使用,event.stopPropagation
2,事件委托
在元素较多的情况下,需要为每个元素添加相同的事件时,普通的添加方式事倍功半,这个时候就比较合适使用事件委托了,它是里利用事件冒泡的原理,在被委托元素所有元素触发事件时,被委托元素都可以接受到,那么这个时候我们就可以通过,event.target来获取不同元素的差异,从而赋予各种功能
new操作符到底到了什么
new Fun()的三个步骤
1,创建一个对象 var obj={}
2,设置空对象的原型是构造函数的原型,obj.__proto__=Fun.prototype
3, 设置构造函数的this指向 Fun.call(obj)
var obj=Fun() //实现了以下内容 var obj={} obj.__proto__=Fun.prototype Fun.call(obj)
用代码实现一个new
function _new(fun,...arg){ const obj=Obj.create(fun.prototype) const ret=fn.apply(obj,arg) return ret instanceof Object ? ret : obj; }
js延迟加载的方式有哪些?
1,defer属性,等待页面解析完成后再加载
<script src="test.js" defer="defer"></script>
2,async,异步加载
<script src="test.js" async></script>
3,动态使用script