//判断是否是数组
let isArr = (arr) => (arr instanceof Array)

//判断是否一维数组
let isTdim = (arr) => arr.reduce((o1, o2) => o1&&!isArr(o2), true)

//多维数组变一维数组
let flat = (arr) => isTdim(arr) ? arr : flat(Array.prototype.concat.apply([],arr))

这里apply函数接受的arr数组个数如果太过会出现问题。在node上测试,120000以内都可以,大于130000,就报错了。chrome上会高一点。

关于闭包

function name() {
    var a = []
    for (var i = 0; i < 11; i++) {
        a[i] = function(){return i}
    }
    return a
}
console.log(name()[0]())

上面这个函数会输出意外的结果:11.这里不再费力地解释为什么会出现这种反人性的结果。只是给出正确而不拗口的写法,只要把var变成let就可以了

function name() {
    var a = []
    for (let i = 0; i < 11; i++) {
        a[i] = function(){return i}
    }
    return a
}
console.log(name()[0]())

如果你担心浏览器不支持let,那就用babel转一下,babel会把let转换成var而不出现作用域提升的问题。


写乐
682 声望6 粉丝