不显试使用循环构造一个空数组,同学们有什么想法吗 那天我在stackoverflow上看到一种方法很有趣,和大家分享下。
?
就是构造一个给定长度的数组,每个元素都是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])
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, [,])了,哈哈,道理都是一样的
@wh1100717 碉堡了
@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);