Js怎么创建一个能遍历的空数组
应用场景
-
- 想快速循环n次, 但是不想使用for/while循环
-
new Array(100).forEach(a => a);
行不通, v8会判断数组对象是否有下标, 来决定是否循环回调, 而new Array(100)
生成的数组没有下标- 1.V8引擎源码如下:
function InnerArrayEvery(f, receiver, array, length) { if (!IS_CALLABLE(f)) throw MakeTypeError(kCalledNonCallable, f); var is_array = IS_ARRAY(array); for (var i = 0; i < length; i++) { if (HAS_INDEX(array, i, is_array)) { var element = array[i]; if (!%_Call(f, receiver, element, i, array)) return false; } } return true; }
- 2.`new Array(100)`, 这样的数组没有下标
var arr = new Array(4); '0' in arr; // false var a = [1]; '0' in a; // true
遍历方法
-
- fill方法
-
1.方法:
// fill第一种 new Array(100).fill(undefined).forEach((a, index) => console.log(index)) // fill第二种 [].fill.call(new Array(100), undefined).forEach((a, index) => console.log(index)) // fill第三种 Array.apply(null, { length: 100 }).fill(undefined) // fill第四种(lodash) _.fill(Array(100), 0); // 最后一种 Array(100).fill(0).forEach((a, index) => console.log(index))
-
- apply, call区别
-
- Array和new Array区别
-
-
2.兼容性: ie不支持
-
- Int8Array: ES2017
-
1.方法:
new Int8Array(100).forEach((a, index) => console.log(index));
-
2.兼容性: ie10及以上支持
-
-
1.方法:
new Array(101).join(0).split('').forEach((a, index) => console.log(index));
-
- 为啥是101
-
-
2.兼容性: ie5.5及以上K支持
-
-
-
1.方法:
[...new Array(100)].map(_=>0).forEach((a, index) => console.log(index));
-
2.兼容性: ie不支持
参考文章
-