阅读 80

面试官:javascript 你会使用循环吗?

游泳健身了解一下:github 和小伙伴一起搞的日常总结

循环你用过什么?

for 
for in
map
forEach
复制代码

那么你知道这的区别吗?

map 我们用来获取某些值,如 [{name:1,age:18}].map(item=>item.name) // 获取到了数据里面的名称的数组
forEach 是用来循环的 
for 常用
复制代码

你知道哪个可以进行操作打断吗,如果当前map里面没有name,那么return的值是啥?

哦!都可以打断吧
    开始我的操作
    // forEach || map
    try{
        [xx].forEach(item=>{
            if(item.xx){
                throw new Error('呀我错了')
            }
        })
    }catch{
        console.log('我被打断了')
    }
    
    // for
    for(let i=0;i<3;i++){
        if(i===1){
            return
        }
    }

map 里没有值的时候那么出来的就是 [undefined,undefined,'张三']
复制代码

知道怎么判断object 是个空吗

object.keys 
for in
JSON.stringify // 当前值如果是一个 function就有问题了
复制代码

用for in 有什么问题吗?

var obj1 = Object.create({
    a:1,
    b: 2
})
Object.prototype.name= '2'
for(let item in obj1){
    console.log(item)
}
// for in 会把原型链上的值也带出来
// 通常我们使用 hasOwnProperty 判断当前值是否在当前的object 上配合使用
复制代码

面试官:基础还可以,加大点难度

有使用过for of 吗?object支不支持for of?

object 不支持for of
for of 是一个迭代器的方式来进行的循环
复制代码

可以手写一个object支持for of吗?

let object1 = {
    name: '张三',
    age: 18,
    [Symbol.iterator]:function(){
        let nextIndex = 0;
        let _that = this
        let arr = Object.keys(_that)
        return {
            next: function(){
                return {
                    value: _that[arr[nextIndex++]],
                    done: nextIndex>arr.length
                }
            }
        }
    }
}

for(let item of object1){
    console.log(item)
}
复制代码

还有什么也支持for of 呢?

天生带有 Symbol.iterator迭代器的都支持for of
有 Array,Set,Map
复制代码

Set,和Map 有用过吗?

Set 常用的就是去重 [...new Set([1,1,1,2,3,2])]
Map 就是键值对的对象
get set delete has clear size for of 等方法
复制代码

weakSet和weakMap有什么特点吗?

weakSet和weakMap 都是弱引用,当前遍历不被引用的时候就会被垃圾回收机制回收,所以不能被for 循环,所以不担心内存泄露
weakSet 只能存对象
weakMap 的键值只能是对象
复制代码

面试官:es6还行,问问异步把

解决异步有什么方法吗?

定时器
promise
async await
postmessage
ajax
复制代码

手写一个promise把

// 其实本身是一个状态模式,修改当前状态,下面这个应该有 60分把(面试够用版本)  要达到100分得解决多个promise 嵌套
function myPromise(fn){
    _this = this
    this.state = 'pending'
    this.successVal = ''
    this.errorVal = ''
    this.successFn = []
    this.errorFn = []
    let resloveFn = function(val){
        if(_this.state === 'pending'){
            _this.state = 'success'
            _this.successVal = val
            _this.successFn.forEach(fn=>fn(val))
        }
    }
    let rejectFn = function(val){
        if(_this.state === 'error'){
            _this.state = 'error'
            _this.errorVal = val
            _this.errorFn.forEach(fn=>fn(val))
        }
    }
    fn(resloveFn,rejectFn)
}
myPromise.prototype.then = function(reslove,reject){
    // 处理异步
    if(this.state === 'pending'){
        this.successFn.push(reslove)
        this.errorFn.push(reject)
    }
    // 处理同步
    if(this.state === 'success'){
        reslove(this.successVal)
    }
    // 处理同步
    if(this.state === 'error'){
        reslove(this.errorVal)
    }
}

let pro = new myPromise((resolve,reject)=>{
        // setTimeout(function () {
        //     resolve(1)
        // },100)
        resolve(1)
    })
    pro.then(res=>{
        console.log(res)
    })

复制代码

什么?用过async和await。哦终极异步方案?,那么你可以手写一个吗?

async 和 await 其实是一个 promise 和 generator 函数的一个超集

function async fn(){
    
}
|| 
function fn(){
    return spawn(function*(){
    
    })
}

// 自动迭代器
function spawn(genFn){
    return new Promise((reslove,reject)=>{
        let gen = genFn()
        function setp(fn)
            let next 
            try{
                next = nextFn()
            }catch(e){
                reject(e)           
            }
            if(next.done){
                reslove(next.value)
            }
            Promise.resolve().then(val)=>{
                setp(function(){
                    return gen.next(val)
                })
            }
        }
        setp(function(){
            return gen.next(undefined)
        })
    }
}

复制代码

面试官:小伙子基础还行,深度不够。我回去好好了解一下

最后

求靠谱内推(北京地区)可以留言我 需要探讨的小伙伴可以加