创建数组的几种方式
const arr1 = new Array(element0, element1, /* … ,*/ elementN);
const arr2 = Array(element0, element1, /* … ,*/ elementN);
const arr3 = [element0, element1, /* … ,*/ elementN];
创建元素为1-N的数组 N=10
- 基本方法
let a = [];
for (var i = 1; i <= N; i++) {
a.push(i);
}
- Fill/Map
let b=Array(N).fill().map((_,i)=>i+1)//[1,2,3,4,5,6,7,8,9,10]
let b1=Array(N).map((_,i)=>i+1)//[ <10 empty items> ]
思考:为什么b1不能达到类似效果,查阅了一下知道了稀疏数组的概念 数组可以包含“空槽”,这与用值 undefined 填充的槽不一样 数组迭代方法时,空槽是被跳过的
参考链接:索引集合类 - JavaScript | MDN (mozilla.org)
- ...运算符/Map
let c=[...Array(N)].map((_,i)=>i+1)
- Array.from
let d=Array.from({length: N}, (_, i) => i + 1)
思考:{length:N}这是什么写法,看了下api原来from可以接受类数组作为参数
接着又发现了length的一些妙用,length 属性是特殊的,如果存在最后一个元素,则其值总是大于其索引的正整数,并且可以修改length使其变为空数组
const cats = [];
cats[30] = ["Dusty"];
console.log(cats.length); // 31
cats.length = 0;
console.log(cats);//[]
- apply
let d=Array.apply(null, { length: N }).map((_,i)=>i+1)
思考:为什么能接受{length: N }作为参数,apply() 方法会以给定的 this 值和作为数组(或类数组对象)提供的 arguments 调用该函数。再看了Array的实现 恍然大悟
function Array() {
if ( arguments.length == 1 &&
'number' === typeof arguments[0] &&
arguments[0] >= 0 && arguments &&
arguments[0] < 1 << 32 ) {
return [ … ]; // array of length arguments[0], generated by native code
}
var a = [];
for (var i = 0; i < arguments.length; i++) {
a.push(arguments[i]);
}
return a;
}
第一次写文章,欢迎大家一起交流