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

287 阅读2分钟

游泳健身了解一下: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 ofArraySetMap

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)
        })
    }
}

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

最后

求靠谱内推(北京地区)可以留言我、