问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

js如何创建一个数组并给数组设置指定宽度

发布网友 发布时间:2022-04-22 17:32

我来回答

5个回答

懂视网 时间:2022-04-22 15:28

本篇文章给大家带来的内容是关于JavaScript中创建和填充任意长度的数组方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

创建数组的最佳方法是通过字面方式:

const arr = [0,0,0];

不过这并不是长久之计,比如当我们需要创建大型数组时。这篇博文探讨了在这种情况下应该怎么做。

没有空洞的数组往往表现得更好

在大多数编程语言中,数组是连续的值序列。在 JavaScript 中,Array 是一个将索引映射到元素的字典。它可以存在空洞(holes) —— 零和数组长度之间的索引没有映射到元素(“缺失索引”)。例如,下面的 Array 在索引 1 处有一个空洞:

> Object.keys(['a',, 'c'])
[ '0', '2' ]

没有空洞的数组也称为 dense packed。密集数组往往表现更好,因为它们可以连续存储(内部)。一旦出现了空洞,内部表示就必须改变。我们有两种选择:

  • 字典。查找时会消耗更多时间,而且存储开销更大。

  • 连续的数据结构,对空洞进行标记。然后检查对应的值是否是一个空洞,这也需要额外的时间。

  • 不管是哪种情况,如果引擎遇到一个空洞,它不能只返回 undefined,它必须遍历原型链并搜索一个名称为“空洞索引”的属性,这需要花费更多时间。

    在某些引擎中,例如V8,如果切换到性能较低的数据结构,这种改变将会是永久性的。即使所有空洞都被填补,它们也不会再切换回来了。

    关于 V8 是如何表示数组的,请参阅Mathias Bynens的文章“V8中的元素类型”。

    创建数组

    Array 构造函数

    如果要创建具有给定长度的 Array,常用的方法是使用 Array 构造函数 :

    const LEN = 3;
    const arr = new Array(LEN);
    assert.equal(arr.length, LEN);
    // arr only has holes in it
    assert.deepEqual(Object.keys(arr), []);

    这种方法很方便,但是有两个缺点:

  • 即便你稍后再用值把数组完全填满,这种空洞也会使这个 Array 略微变慢。

  • 空洞的默认值一般不会是元素的初始“值”。常见的默认值是零。

  • Array 构造函数后面加上 .fill() 方法

    .fill()方法会更改当前的 Array 并使用指定的值去填充它。这有助于在用 new Array() 创建数组后对其进行初始化:

    const LEN = 3;
    const arr = new Array(LEN).fill(0);
    assert.deepEqual(arr, [0, 0, 0]);

    警告:如果你用对象作为参数去 .fill() 一个数组,所有元素都会引用同一个实例(也就是这个对象没有被克隆多份):

    const LEN = 3;
    const obj = {};
    
    const arr = new Array(LEN).fill(obj);
    assert.deepEqual(arr, [{}, {}, {}]);
    
    obj.prop = true;
    assert.deepEqual(arr,
     [ {prop:true}, {prop:true}, {prop:true} ]);

    稍后我们会遇到的一种填充方法( Array.from() )则没有这个问题。

    .push() 方法

    const LEN = 3;
    const arr = [];
    for (let i=0; i < LEN; i++) {
     arr.push(0);
    }
    assert.deepEqual(arr, [0, 0, 0]);

    这一次,我们创建并填充了一个数组,同时里面没有出现漏洞。所以操作这个数组时应该比用构造函数创建的更快。不过 创建 数组的速度比较慢,因为引擎可能需要随着数组的增长多次重新分配连续的内存。

    使用 undefined 填充数组

    Array.from() 将 iterables 和类似数组的值转换为 Arrays ,它将空洞视为 undefined 元素。这样可以用它将每个空洞都转换为 undefined

    > Array.from({length: 3})
    [ undefined, undefined, undefined ]

    参数 {length:3} 是一个长度为 3 的类似 Array 的对象,其中只包含空洞。也可以使用 new Array(3),但这样一般会创建更大的对象。
    下面这种方式仅适用于可迭代的值,并且与 Array.from()具有类似的效果:

    > [...new Array(3)]
    [ undefined, undefined, undefined ]

    不过 Array.from()通过 new Array() 创建它的结果,所以你得到的仍然是一个稀疏数组。

    使用 Array.from() 进行映射

    如果提供映射函数作为其第二个参数,则可以使用 Array.from() 进行映射。

    用值填充数组

  • 使用小整数创建数组:

    > Array.from({length: 3}, () => 0)
    [ 0, 0, 0 ]
  • 使用唯一(非共享的)对象创建数组:

    > Array.from({length: 3}, () => ({}))
    [ {}, {}, {} ]
  • 按照数值范围进行创建

  • 用升序整数数列创建数组:

    > Array.from({length: 3}, (x, i) => i)
    [ 0, 1, 2 ]
  • 用任意范围的整数进行创建:

    > const START=2, END=5;
    > Array.from({length: END-START}, (x, i) => i+START)
    [ 2, 3, 4 ]
  • 另一种创建升序整数数组的方法是用 .keys(),它也将空洞看作是 undefined 元素:

    > [...new Array(3).keys()]
    [ 0, 1, 2 ]

    .keys()返回一个可迭代的序列。我们将其展开并转换为数组。

    备忘速查:创建数组

    用空洞或 undefined填充:

  • new Array(3)
    [ , , ,]

  • Array.from({length: 2})
    [undefined, undefined]

  • [...new Array(2)]
    [undefined, undefined]

  • 填充任意值:

  • const a=[]; for (let i=0; i<3; i++) a.push(0);
    [0, 0, 0]

  • new Array(3).fill(0)
    [0, 0, 0]

  • Array.from({length: 3}, () => ({}))
    [{}, {}, {}] (唯一对象)

  • 用整数范围填充:

  • Array.from({length: 3}, (x, i) => i)
    [0, 1, 2]

  • const START=2, END=5; Array.from({length: END-START}, (x, i) => i+START)
    [2, 3, 4]

  • [...new Array(3).keys()]
    [0, 1, 2]

  • 推荐的模式

    我更喜欢下面的方法。我的侧重点是可读性,而不是性能。

  • 你是否需要创建一个空的数组,以后将会完全填充?

    new Array(LEN)
  • 你需要创建一个用原始值初始化的数组吗?

    new Array(LEN).fill(0)
  • 你需要创建一个用对象初始化的数组吗?

    Array.from({length: LEN}, () => ({}))
  • 你需要创建一系列整数吗?

    Array.from({length: END-START}, (x, i) => i+START)
  • 如果你正在处理整数或浮点数的数组,请考虑Typed Arrays —— 它就是为这个目的而设计的。它们不能存在空洞,并且总是用零进行初始化。

    提示:一般来说数组的性能无关紧要

  • 对于大多数情况,我不会过分担心性能。即使是带空洞的数组也很快。使代码易于理解更有意义。

  • 另外引擎优化的方式和位置也会发生变化。今天最快的方案可能明天就不是了。

  • 热心网友 时间:2022-04-22 12:36

    使用Array方式创建数组.

    如:

    var arr = new Array(5);//创建了一个宽度是5的数组。

    热心网友 时间:2022-04-22 13:54

    var array = new Array([size])这是一个初始的长度,这个长度可以变的;楼上说的对,JS不像JAVA里的数组长度是定死的,他这个可以动态的增加的。你想增加就增,这是JS一个灵活之处

    热心网友 时间:2022-04-22 15:29

    var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度
    要说明的是,虽然创建数组指定了长度,但实际上所有情况下数组都是变长的,也就是说即使指定了长度为5,仍然可以将元素存储在规定长度以外的,注意:这时长度会随之改变。

    热心网友 时间:2022-04-22 17:20

    var arr = [];
    指定宽度 没有意义,JS 不支持最大宽度*。
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 javascript 定义初始化数组函数 JS的初始化方法是? JS 数组中元素的长度最大是多少?能设置吗? js初始化Array为什么要设定长度 为什么手机有流量有话费但是上不了网? 买房评估高了很多,多交的税能退税吗怎么投诉 买房交契税吗是不是很高 用电饭锅可以做蛋糕吗? 买房契税税率是多少 用电饭锅做蛋糕,不用糖和牛奶可以吗? 电饭煲可以做蛋糕吗? 电饭锅没有蛋糕键可以做蛋糕吗 买房要交些什么税?是不是契税交最多? 在家里做蛋糕用电饭煲可以吗? 买房有高税怎么办 用电饭煲真的可以做蛋糕吗? 买二手房要交高税是什么意思 买房税太高了,无论一手房还是二手房? 买房有哪些税费需要缴纳? 买房需要交哪些税啊??? 税率是多少? 怎样用javascript给数组初始化? javascript的数组最大长度是多少 js 数组及in运算符问题 JS 数组问题 404 Not Found 关于用js让数组大小排序 js数组的问题 JavaScript数组赋值的问题 js数组操作一点问题 光猫用路由模式可以用交换机连接多个电脑吗? 电信光猫后接了一台路由器再接交换机,该如何配置? 光猫后面接交换机还是路由器 自带路由的光纤猫和交换机路由器的连接设置 光猫连接能直接连接交换机吗? 汽车强制险都包括什么 汽车交的强险都保什么 前海人寿医院到底是公立的还是私立的? 前海人寿保险股份有限公司广东分公司怎么样? 广州前海人寿医院跟前海人寿是什么关系? 广州前海人寿医院有限公司怎么样?