在JavaScript中设置数组长度是一种反模式吗?

在JavaScript中设置数组长度是一种反模式吗?,javascript,Javascript,使用以下代码是否不好: var a = [1,2,3,4]; a.length = 2; // 3 and 4 are removed 它有良好的浏览器支持吗?删除的值是否正确地被垃圾收集?最好使用slice,因为您的意图是明确的 var truncated = a.slice(0,2) 但Slice确实创建了一个新数组 如果这是一个问题,那么修改length属性没有什么错 它实际上是最快的截断方式,在所有浏览器中都受支持 因为它是可写的(如图所示),所以可以这样使用它 可以将length属

使用以下代码是否不好:

var a = [1,2,3,4];
a.length = 2; // 3 and 4 are removed

它有良好的浏览器支持吗?删除的值是否正确地被垃圾收集?

最好使用slice,因为您的意图是明确的

var truncated = a.slice(0,2)
但Slice确实创建了一个新数组

如果这是一个问题,那么修改length属性没有什么错

它实际上是最快的截断方式,在所有浏览器中都受支持

因为它是可写的(如图所示),所以可以这样使用它

可以将length属性设置为随时截断数组。通过更改数组的长度属性扩展数组时,实际元素的数量不会增加;例如,如果在当前为2时将“长度”设置为3,则该数组仍仅包含2个元素

在Mozilla开发者网络上,甚至有一个如何缩短阵列的示例

if (statesUS.length > 50) {
    statesUS.length = 50;
}

这不是一种反模式。所有主要浏览器都支持它。
中提到了这种截断数组的方法,因此它不是反模式

在JavaScript中设置数组长度是一种反模式吗

不可以。可以将其设置为截断数组

它有良好的浏览器支持吗

是,请参见此处的兼容性矩阵:

删除的值是否正确地被垃圾收集

是的,他们应该。他们真的会得到gced吗?如果这是一个真正的问题,你需要分析JavaScript代码。

数组是外来对象

外来对象是任何形式的对象,其属性语义在任何方面都不同于默认语义。1

数组的属性语义是特殊的,在这种情况下,更改长度会影响数组的实际内容

数组对象是对数组索引属性键进行特殊处理的外来对象[…]

还概述了此数组外来对象的特定属性键的行为

[…]每个数组对象都有一个长度属性,其值始终是小于2^32的非负整数。length属性的值在数字上大于名称为数组索引的每个自有属性的名称;每当创建或更改数组对象的自有属性时,都会根据需要调整其他属性以保持此不变[…]

本节详细说明length属性是32位整数。也就是说,如果添加了一个数组索引,那么长度就会改变。这意味着,当使用自己的属性名(不是索引)时,长度不会更改,并且非索引的名称在数字上被视为小于索引。这意味着,如果您有一个数组,并且向其中添加了一个字符串(也不是隐式数字,如not“3”)属性,则更改长度以删除元素不会删除与字符串属性关联的值。比如说,

var a = [1,2,3,4];
a.hello = "world";
a.length = 2; // 3 and 4 are removed
console.log(a.hello);//"world"
[…]具体而言,每当添加名称为数组索引的自有属性时,如果需要,长度属性的值将更改为比该数组索引的数值多一个;[……]

除了截断之外,还可以使用索引进行扩展。如果使用索引值(基本上是整数),则长度将更新以反映该更改。由于JavaScript中的数组是稀疏的(如中所示,不允许有间隙),这意味着为更大的索引添加值可以使数组更大

var a = [1,2,3,4];
a[50] = "hello";
console.log(a.length);//51
[…]并且每当更改length属性的值时,将删除名称为数组索引且其值不小于新长度的所有属性

最后,这是OP提出的具体问题。修改数组的长度属性时,它将删除数值大于新长度值减1的所有索引和值。在OP的示例中,我们可以清楚地看到,将长度更改为2会删除索引2和3处的值,只留下索引为0和1的前两个值

上述删除的算法可以在定义中找到

  • b。让DeleteSuccessed为
    A.[Delete]](ToString(oldLen))
    它将索引转换为字符串,并对索引上的对象使用删除行为。此时将删除整个属性。由于它在内部到达delete调用,因此没有理由相信它会泄漏内存,甚至没有理由相信它是一种反模式,正如语言规范中明确描述的那样

    总之,它是否有良好的浏览器支持?对删除的值是否正确地被垃圾收集?对

    然而,这是一种反模式吗?这两种说法都有道理。它真正分解为对其他使用相同代码的人的语言的熟悉程度,这是一种很好的说法,它可能没有最好的可读性。另一方面,由于JavaScript使用的每个字符都会占用带宽或内存(因此需要缩小和绑定),因此采用这种方法来截断数组是很有用的。通常情况下,担心这种类型的细节将是一种微观优化,应该在相关代码总体设计的背景下,逐个考虑使用这种特殊属性

    一,
    2.
    3.

    它有良好的浏览器支持吗

    对。这是自以下事件以来一直存在的:

    具体来说,每当添加名称为数组索引的属性时 如有必要,将length属性更改为比该数组索引的数值大一个;什么时候 length属性已更改,每个属性的名称都是一个数组索引,其值不小于 新长度将自动删除

    标准ECMA-262,15.4

    在ECMAScript 5中
    // a is the array and n is the eventual length
    
    a.length = n;
    
    a.splice(n, a.length - n); // equivalent
    a.splice(n, a.length);     // also equivalent
    
    a.slice(0, n);  // returns a new array with the first n elements