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

 

 如何通过es5实心promise

 

 

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

this指向详细

 

 

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

 

posted @ 2021-08-23 16:20  来吃点代码  阅读(42)  评论(0编辑  收藏  举报