每天5道JavaScript实战面试题

1、☆ ☆ ☆ 实现一个函数add(),运算结果可以满足如下预期结果

function add(){
    var args = Array.prototype.slice.call(argumenrs);

    var fn = funtion (){
var sub_arg = Array.prototype.slice.call(arguments);

    //把全部的参数聚集到参数的入口为一个参数:args.concat(sub_arg)
        
    return add.apply(null,args.concat(sub_arg);
}
 

fn.valueOf = function(){
return args.reduce(function(a,b){
    return a + b;

})
}
return
}
add(1,2,3)(10) //16
add(1)(2)(3,4)(5)//15

 2、 ☆ ☆统计字符串中字母个数或统计最多的字母数

function count(str){

var obj = {}

var i = 0 

var len = str.length

for ( var  i = 0 ;i< len; i++){
 var curChar = str.charAt(i);

//如果结果对象纯在字符的属性,则自增,否则值为1

  if (obj[curChar]){

    obj[curChar]++;

}else
    obj[curChar] = 1;

 }
}
//返回结果
return obj
}
var str = "javaScript"
console.log(count(str))

 3、☆ ☆ ☆数组扁平化,不用api

function myFlat (arr){

let res = []

for(let i = 0; i <arr.length; i++){
    if(arr[i]instanceof Array){
        res= res.concat(myFlat(arr[i]))    

    }else{
    
        res.push(arr[i])

}

}
return res
}
let arr = [1,[2,3,[4,5]]]

console.log(myFlat(arr))

4、☆ ☆ ☆ 如何避免回电地狱?

1. Promise 对象就是为了解决这个问题而提出的。它不是新的语法功能而是一种新的写法,允许将回调函数的嵌套,改成链式调用。

Promise只有两个状态resolve和reject,当它触发任何一个状态后,它会将当前的值缓存起来,并在有回调函数添加进来的时候尝试调用回调函数,如果这个时候还没有触发resolve或者reject,那么回调函数会被缓存,等待调用,如果已经有个状态(resolve或者reject),则立刻调用回调函数。并且所有回调函数在执行后都立即被销毁。

2. ES6 co/yield 方案

yield :Generator 函数是携程在ES6 的实现,而yield 是Generator关键字,异步操作需要暂停的地方,都用yield语句注明。

3. ES7 async/await 方案

async/await是ES7的新标准,并且在node7.0中已经得到支持。

它就是Generator函数的语法糖,async函数就是将Generator函数的星号(*)替换成async,将yield替换成await,仅此而已。可以理解管阀对co和Generator封装方案

 5、开发过程中遇到内存泄漏的问题都有哪些?

1. 当页面中元素被移除或者替换时,若元素绑定的事件扔没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄漏。

2. 由于是函数内定义函数,并且内部函数--事件回调的引用外漏了,形成了闭包。闭包可以维持函数内局部变量,使其得不到释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值