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