今天学到了之创建数组篇

61 阅读1分钟

创建数组的几种方式

const arr1 = new Array(element0, element1, /* … ,*/ elementN);
const arr2 = Array(element0, element1, /* … ,*/ elementN);
const arr3 = [element0, element1, /* … ,*/ elementN];

创建元素为1-N的数组 N=10

  1. 基本方法
let a = [];
for (var i = 1; i <= N; i++) {
   a.push(i);
}
  1. 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)

  1. ...运算符/Map
let c=[...Array(N)].map((_,i)=>i+1)
  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);//[]
  1. 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;
}

第一次写文章,欢迎大家一起交流