不使用循环构造空数组
发布于 9个月前 作者 waksana 877 次浏览

不显试使用循环构造一个空数组,同学们有什么想法吗 那天我在stackoverflow上看到一种方法很有趣,和大家分享下。

21 回复

就是构造一个给定长度的数组,每个元素都是undefined。不用循环。 arr = new Array(n) 不可以,因为arr.forEach()里面的函数不会被执行

@waksana forEach 遇到 undefined 不会执行,不知遇到其他零值会不会也这样。

那你说的有趣方法呢?

@alsotang 好吧,undefined也是能运行的,不过new Array 没有真的生成10个undefine。他显示的是[undefined * 10]. 解决办法是 Array.apply(null, {length:10})

@waksana 很 trick 啊。我大概猜到了部分原理,{length:10} 被 Array 当成了一个长度为 10 的数组。于是新数组被真的逐个赋值了。

array json形式是{ length:2, 0:“”,1:“" }

这个可以打印验证么?求代码

Array.apply(null,Array(10)) //也可以,,

@coordcn {length:10, "0":“”,“1”:“” }, 这是“类数组”对象。

undefined 有没有办法改为 0 值呢?

构造了之后用map…map不算循环吧

@coordcn console.dir([1,2]),数组和类数组对象的序列化结果是一样的,只是数组的原型会带有很多方法,比如slice,join之类的,var args = Array.prototype.slice.call(arguments);,这个可以把类数组对象转换为数组。

var arr = []; arr[9] = undefined;

new Array(10).join(‘,’).split(‘,’).map(function(){return undefined});

你这个…只有一个被赋值…

@waksana 这样也可以

Array.apply this, [,,,,,,,,,]
Array.apply this, Array(10)
Array.apply this, Array.apply(this, [10])

@alsotang

Object.apply(this, argumenst)传参方式是一个由各个参数组成的数组或类数组(一个有length属性的对象),传入参数个数取决于 length 的值。比如

Array.apply this, {
    0:0
    1:1
    2:2
    length:4
}
#输出为 [ 0, 1, 2, undefined ]

而这实际上是Object.apply的用法,Array只是调用而已,它不负责处理{length:10}

具体类数组相关可以参考这里 http://blog.segmentfault.com/f2e/1190000000415572

Array(10)会转换成[,],然后就是Array.apply(null, [,])了,哈哈,道理都是一样的

@alsotang 哈哈 看了觉得好玩 特意去查了一下…

递归

var GenerateArray = function(i,array){
    array = array||[];
    if (i>0){
        --i;
        array.push(undefined);
        return GenerateArray(i,array);
    }
    return array;
}

var a = GenerateArray(10);
console.log(a);
console.log(a.length);
回到顶部