如何在JavaScript中清空数组?

aka*_*no1 2198 javascript arrays

有没有办法清空数组,如果可能的话.remove()

例如,

A = [1,2,3,4];
Run Code Online (Sandbox Code Playgroud)

我该如何清空?

Phi*_*ert 4155

清除现有阵列的方法A:

方法1

(这是我对问题的原始答案)

A = [];
Run Code Online (Sandbox Code Playgroud)

此代码将变量A设置为新的空数组.如果你没有在其他任何地方引用原始数组,A这是完美的,因为这实际上创建了一个全新的(空)数组.您应该小心使用此方法,因为如果您从另一个变量或属性引用此数组,原始数组将保持不变.如果仅通过其原始变量引用数组,则仅使用此选项A.

这也是最快的解决方案.

此代码示例显示了使用此方法时可能遇到的问题:

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']
Run Code Online (Sandbox Code Playgroud)

方法2(由Matthew Crumley 建议)

A.length = 0
Run Code Online (Sandbox Code Playgroud)

这将通过将其长度设置为0来清除现有数组.有些人认为这可能不适用于JavaScript的所有实现,但事实证明情况并非如此.它在ECMAScript 5中使用"严格模式"时也有效,因为数组的长度属性是读/写属性.

方法3(由安东尼建议)

A.splice(0,A.length)
Run Code Online (Sandbox Code Playgroud)

使用.splice()将完美地工作,但由于该.splice()函数将返回包含所有已删除项的数组,它实际上将返回原始数组的副本.基准测试表明,这对绩效没有任何影响.

方法4(由tanguy_k 建议)

while(A.length > 0) {
    A.pop();
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案不是很简洁,它也是最慢的解决方案,与原始答案中引用的早期基准相反.

性能

在清除现有阵列的所有方法中,方法2和3在性能上非常相似,并且比方法4快得多.请参阅此基准.

正如Diadistis在下面的回答中指出的那样,用于确定上述四种方法的性能的原始基准是有缺陷的.原始基准重用了清除的数组,因此第二次迭代清除了一个已经为空的数组.

以下基准修复了这个缺陷:http://jsben.ch/#/hyj65.它清楚地表明方法#2(长度属性)和#3(拼接)是最快的(不计算方法#1不改变原始数组).


这一直是一个热门话题和争议的原因.实际上有很多正确的答案,并且由于这个答案在很长一段时间内已被标记为已接受的答案,因此我将在此处包含所有方法.如果您投票赞成此答案,请同时提及我所引用的其他答案.

  • `> 0`更具可读性恕我直言.并且两者之间没有性能差异. (310认同)
  • `while(A.length){A.pop(); }`,不需要`> 0` (175认同)
  • 如果数组中的项是假的,则不能使用`while(A.pop())`.例如,A = [2,1,0,-1,-2]将导致A等于[2,1].甚至`while(A.pop()!== undefined)`也不起作用,因为你可以将一个未定义的数组作为其中一个值.可能是为什么编译器没有优化它. (43认同)
  • @daghan,你一点也不清楚.即使在为`a`分配了一个新数组之后,`b`也包含对旧数组的引用.`c`和`d`继续引用相同的数组.因此预计产出的差异. (10认同)
  • @DiegoJancic方法#1不计算,因为它不清除数组.它创造了一个新的.它不应该包含在基准中. (6认同)
  • 有没有人打扰*找出为什么完全不直观的while/pop事物似乎是最快的练习? (3认同)
  • 我希望我们可以只有.clear()方法,不是吗?.length = 0的问题; 是没有好方法知道垃圾收集器将如何反应.该数组仍然应该保存对其他实例的引用,尽管可能已经实现了一些魔术来管理它. (3认同)
  • var a = [1,2,3]; var b = a; a = []; 的console.log(b.length个); var c = [1,2,3]; var d = c; while(c.length){c.pop(); } console.log(d.length); (2认同)
  • 关于方法3:“ A.splice(0, A.length) ” 第二个参数真的有必要吗?“ A.splice(0) ”不会一样吗? (2认同)
  • @PåhlMelin:你所说的正是正在发生的事情,我们都同意。我的评论是针对那些实际上不相信 __most 如果不是所有现代浏览器都设法使 A.length = 0 成为清空数组的最有效方法的人__ :快速,干净,无内存泄漏,没有新数组, __and 即使您有其他变量引用它也可以工作__ !瞧! (2认同)
  • 这实际上并不能回答问题。这不会清空现有数组,而是丢弃现有数组并用空数组替换它,这不是一回事。 (2认同)
  • 不喜欢这样的事实:您将其他人的解决方案复制到您自己的答案中,而没有勇气将您的答案变成维基答案。 (2认同)

Mat*_*ley 2395

如果您需要保留原始数组,因为您还有其它应该更新的引用,您可以通过将其长度设置为零来清除它而不创建新数组:

A.length = 0;
Run Code Online (Sandbox Code Playgroud)

  • @Pacerier:它仍然适用于ES5.从第15.4节开始:"...每当更改length属性时,将自动删除名称为数组索引且值不小于新长度的每个属性" (203认同)
  • ECMAScript 5标准对此有何看法? (16认同)
  • @Acorn是的,它适用于所有浏览器. (12认同)
  • @LosManos即使在严格模式下,`length`也是一个特殊的属性,但不是只读的,所以它仍然可以工作. (11认同)
  • @MattewCrumley我做了一些测试,似乎a.length = 0并不能有效清除整个数组.http://jsperf.com/length-equal-0-or-new-array我想如果你有一个refence(并且你没有添加你想要保留的额外属性),最好创建新的数组,然后将旧的留给垃圾收集器,它将在适当的时候运行. (10认同)
  • @Blessing不,需要实现删除索引> =新长度的条目,这会导致引用不再存在,留下任何对象可供垃圾收集(假设没有其他引用)。如果你这样做:`a = [0,1,2]; a.长度=1;console.log(a[2]);`,你会得到 undefined,而不是 2。 (3认同)
  • @einar:JavaScript数组始终会扩展以适合您放置在其中的任何内容,因此,当您调用`myarray.push(whatever)`时,它将增加一个长度。因此,设置长度会截断数组,但它不是永久的。 (2认同)
  • @SteveSiebert不应在正确实现的解释器中使用,而且我不知道可以实现的任何实现。当然,这是有可能的,但它比其他不正确的泄漏源更不可能。 (2认同)
  • 请记住,如果您创建一个新数组,GC 稍后也会及时处理旧数组!所以我们可以说 `arr.length = 0;` = 立即 GC,`arr = [];` = 稍后 GC (2认同)
  • @jollarvia ECMAScript规范要求删除新长度以上的元素,因此任何正确的实现都会使任何无法访问的元素无法收集.这并不一定意味着它们会立即缩小实际阵列的存储空间.具体来说,如果新长度小于原始长度的一半,V8仅重新分配数组,但将长度设置为零实质上是在幕后重新分配新数组. (2认同)
  • 在 ES6 中,你想使用 `const` 而不是 `var`,这使得新的 init 没那么有用。`const arr.lenth = 0` 非常快。http://jsben.ch/oZr0V (2认同)

tan*_*y_k 283

这里最快的落实工作,同时保持相同的阵列("可变"):

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}
Run Code Online (Sandbox Code Playgroud)

FYI Map定义了对于Array也是while (array.pop())合乎逻辑的.clear()

或者作为Underscore.js mixin:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}
Run Code Online (Sandbox Code Playgroud)

或者一个简单的功能:

describe('clearArray()', () => {
  test('clear regular array', () => {
    const array = [1, 2, 3, 4, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });

  test('clear array that contains undefined and null', () => {
    const array = [1, undefined, 3, null, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});
Run Code Online (Sandbox Code Playgroud)

TypeScript版本:

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}
Run Code Online (Sandbox Code Playgroud)

仅供参考,它不能简化为clear():测试将失败.

以及随之而来的测试:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}
Run Code Online (Sandbox Code Playgroud)

这里更新的jsPerf:http : //jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152

  • @thefourtheye良好的性能解决方案,虽然我同意@naomik,但你不应该修改原生对象.说它应该存在于旁边,问题是你正在修改*全局*,这很糟糕.如果您提供其他人使用的代码,那么它应该没有不可预见的副作用.想象一下,如果另一个库*也*修改了`Array.prototype`并且它做了一些稍微不同的事情,那么整个代码中的所有代码`[] .clear()`都有些错误.这对调试来说并不好玩.所以,一般的信息是:不要修改全局变量. (7认同)
  • TT你的答案是唯一一个正确而快速(同时)但却有一些更少"赞成"的答案.好吧,似乎人们喜欢漂亮的解决方案: (5认同)
  • @thefourtheye不修改全局范围的重点是因为*如果其他人的代码已经(或将要)使用该名称,您将不会知道*.我建议局部范围内的函数.因此,在你的应用程序/库的[IIFE](http://en.wikipedia.org/wiki/Immediately-invoked_function_expression)中,执行`function clear(arr){while(arr.length)arr.pop(); 然后用`clear(arr)`而不是`arr.clear()`清除数组. (3认同)
  • 事实证明这个方法比`.splice()`和`.length = 0`慢很多.基准测试不正确.看到我更新的答案. (2认同)

小智 206

更加跨浏览器友好且更优化的解决方案是使用该splice方法清空数组A的内容,如下所示:

A.splice(0, A.length);

  • 为什么这个跨浏览器友好?什么浏览器有A.length的问题? (47认同)
  • 我还发现只有`A.splice(0)`也可以. (8认同)
  • @ jm2你所说的并不完全正确.它实际上修改了有问题的数组,随后所有引用都受到影响.看看我的jsFiddle上的测试:http://jsfiddle.net/shamasis/dG4PH/ (4认同)
  • @alex没有,`splice`修改数组并返回已删除的条目.首先阅读文档:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/splice (3认同)
  • 我们可以使用[逗号运算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator)来阻止返回结果数组:`A.splice(0 ,A.length),0;`.这将返回值"0",就像`A.length = 0;`会.生成的数组仍然被创建并且_should_导致脚本运行得更慢:([jsperf](http://jsperf.com/clear-an-array)~56%慢).浏览器实现会影响这一点,虽然我没有理由看到`splice`比设置`length`更快. (3认同)
  • 这是最正确的答案,因为这实际上"清除了数组内容并保留了对原始数组对象的引用. (2认同)
  • 与其他方法相比,`splice`也非常慢.http://jsperf.com/array-splice-vs-array-length-0/2 (2认同)
  • 这绝对是最“反应友好”的方式,因为它的可变和反应框架(如 VUE 等)将能够“检测”此更改并相应地重绘 UI (2认同)

Bek*_*caj 85

到目前为止2739投票的答案都是误导和错误的.

问题是:"你如何清空你现有的阵列?" 例如A = [1,2,3,4].

  1. 说" A = []是答案"是无知的,绝对不正确.[] == []假的.

    这是因为这两个数组是两个独立的,单独的对象,具有自己的两个身份,在数字世界中占据了自己的空间,每个都独立存在.


假设您的母亲要求您清空垃圾桶.

  • 你没有带来一个新的,好像你已经完成了你所要求的.
  • 相反,你清空垃圾桶.
  • 你没有用新的空罐替换填充的那个,并且你没有从填充的罐中取出标签"A"并将其粘贴到新的罐中,如同在 A = [1,2,3,4]; A = [];

清空数组对象是最简单的事情:

A.length = 0;
Run Code Online (Sandbox Code Playgroud)

这样,"A"下的can不仅是空的,而且还像新的一样干净!


  1. 此外,在罐子空了之前,您不需要用手取出垃圾!您被要求在一个回合中完全清空现有的一个,而不是在罐子变空之前拿起垃圾,如:

    while(A.length > 0) {
        A.pop();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 也不是,将你的左手放在垃圾桶的底部,将你的右手握在顶部以便能够将其内容拉出来,如下所示:

    A.splice(0, A.length);
    
    Run Code Online (Sandbox Code Playgroud)

不,你被要求清空它:

A.length = 0;
Run Code Online (Sandbox Code Playgroud)

这是唯一正确清空给定JavaScript数组内容的代码.

  • 建议的解决方案唯一的问题是垃圾仍然存在,只是你改变了告示板,说没有垃圾.应该仍然存在对旧数组的引用.在设置.length = 0时,你能确定垃圾收集器,还会删除对数组及其属性的所有引用吗?我认为它确实如此,但对我来说这是神奇的.一个.clear()方法是可取的,以避免混淆至少说. (9认同)
  • 我从未说过这个解决方案是错误的.问题是这整个线程是完全不必要的.超过3000张投票显示,试图弄清楚最佳方法是什么应该使它成为EMCA破解头开发人员添加这种方法的有效案例.没有人应该经常搞清楚.有三种 - 四种不同的方法.在一些基准测试中,长度解决方案比其他测试慢得多.此外,对任何合理的开发者来说,设置.length = 0的想法都不会令人满意. (7认同)
  • 因此,我宁愿自己清楚.一个明确的方法可以原型,但这只是丑陋.我的观点是,这个实现应该已经存在,以便超过1万名开发人员不必花费数小时阅读这个帖子,而不是考虑花费更多时间进行基准测试的所有其他人. (7认同)
  • 没有阳光,这根本不是真的。在尝试反对像 JavaScript 核心功能基础这样坚如磐石的东西之前,您可能希望测试一些东西并足够深入地了解它们。这不是“我的解决方案”,它永远是基本的 JS 语法。清空数组的标准语法可能是可疑的“A.length = 0;”。如果您希望拥有诸如“A.clear”之类的方法,您可以使用此标准语法轻松将该方法添加到数组中:“Array.prototype.clear = function(){this.length = 0}”。玩得开心。 (3认同)
  • 我喜欢这个答案中与现实世界的隐喻。感人的! (3认同)
  • 因为要完成它应该完成的任务,所以必须删除所有引用..length = 0甚至不是一个方法调用,所以如果在设置为0时有其他动作(在大多数浏览器中通过定义setter),我仍然会认为实际上相信它做了它想象的太神奇了去做. (2认同)
  • 只有一种方法可以清空数组,用新传入的数据填充它,然后再次丢弃它。所有其他的要么不是,要么效率低得离谱,并且对CPU的消耗不可原谅。唯一实用的替代方案是“A(n) = A.splice( 0, A.length );”,以防您需要备份以前的内容。ps `Array.length` 是一个读写属性\方法,以防您错过了这个基本事实。这意味着,您可以将其扩展为新的长度,但不能将其修剪为您想要的任何长度,除此之外,您还可以通过将其长度缩短为 0 来丢弃所有成员。它是数组的瑞士刀。 (2认同)

小智 63

性能测试:

http://jsperf.com/array-clear-methods/3

a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length)  // 97% slower
while (a.length > 0) {
    a.pop();
} // Fastest
Run Code Online (Sandbox Code Playgroud)

  • 请删除这个答案,因为它是错误的,并链接到无意义的有缺陷的测试作为假证据. (14认同)
  • 在没有注意到您的平台的情况下添加百分比更改并不是很有用.在我的机器上,在Chrome 34中pop的速度非常快,但在最新的Firefox中实际上比[]慢. (9认同)
  • @chqrlie不是.这是最慢的方法.基准测试存在缺陷. (9认同)
  • 在Chrome下的测试结果中肯定有些可疑.在其他3种解决方案中,弹出循环如何能够快得多? (4认同)
  • 在Windows NT 6.3 64位上的Firefox 39.0 32位测试中,a = []是最快的! (2认同)
  • 当然,创建数组的新实例比循环和弹出它要快...因此,如果在 chrome 中弹出速度更快,则意味着创建新数组的创建存在错误 (2认同)

lee*_*ech 37

您可以将其添加到JavaScript文件中以允许"清除"数组:

Array.prototype.clear = function() {
    this.splice(0, this.length);
};
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

var list = [1, 2, 3];
list.clear();
Run Code Online (Sandbox Code Playgroud)

或者如果你想确定你没有破坏某些东西:

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}
Run Code Online (Sandbox Code Playgroud)

很多人认为你不应该修改原生对象(比如Array),我倾向于同意.请谨慎决定如何处理此问题.

  • 修改javascript原始函数(如Array和String)是"不赞成的".您可能会重载已存在的函数并删除对象类.可能有一个模糊的javascript引擎已经有clear()并期望它的行为方式不同.我说的就是小心谨慎. (15认同)
  • @naomik你能解释一下为什么做这样的事情会被人皱眉吗? (2认同)

Dia*_*tis 19

关于while; pop/shift表现在答案和评论中存在很多混乱和错误信息.while/pop解决方案(如预期)具有最差的性能.实际发生的情况是,对于在循环中运行代码段的每个样本,安装程序只运行一次.例如:

var arr = [];

for (var i = 0; i < 100; i++) { 
    arr.push(Math.random()); 
}

for (var j = 0; j < 1000; j++) {
    while (arr.length > 0) {
        arr.pop(); // this executes 100 times, not 100000
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个正常工作的新测试:

http://jsperf.com/empty-javascript-array-redux

警告:即使在此版本的测试中,您实际上也看不到真正的区别,因为克隆数组会占用大部分测试时间.它仍然表明这splice是清除阵列的最快方法(不[]考虑因为虽然它是最快的,但实际上并没有清除现有的阵列).


mat*_*ter 15

如果您对内存分配感兴趣,可以使用类似这个jsfiddle和chrome dev工具的时间轴选项卡来比较每种方法.您将需要使用底部的垃圾箱图标在"清除"阵列后强制进行垃圾收集.这应该为您选择的浏览器提供更明确的答案.这里的很多答案都是陈旧的,我不会依赖它们,而是像@ tanguy_k上面的答案那样测试.

(有关上述标签的介绍,您可以在这里查看)

Stackoverflow强迫我复制jsfiddle所以这里是:

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}
function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]="something"
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

您应该注意它可能取决于数组元素的类型,因为javascript管理字符串的方式与其他基本类型不同,更不用说对象数组了.类型可能会影响发生的事情.


Ben*_*gúz 14

Array.prototype.clear = function() {
    this.length = 0;
};
Run Code Online (Sandbox Code Playgroud)

并称之为: array.clear();

  • 请不要鼓励修改本机对象. (75认同)
  • 为什么人们会倾向于抓住已接受的答案并将其置于原型功能中?你真的在你的项目中这样做吗?您是否拥有包含在每个项目中的大量原型添加库? (19认同)
  • @naomik*"请不要鼓励修改本机对象."* - 我完全同意这一点,但只是重复这句话本身就是傲慢的.提出这样一个解决方案的人很可能不会意识到后果,并且放弃这条线而不是提供简短的解释或链接并不表达除了"我们,比你聪明的人,告诉你不要这样做,因为我们知道更好"*. (9认同)
  • 作为参考:[为什么扩展本机对象是一种不好的做法?](/sf/ask/982392631/) (5认同)
  • 为什么不直接输入array.length = 0? (4认同)
  • 请黑客/开发者......不要修改东西,这会让我们得到什么. (3认同)
  • @JohnWhite,我实际上有给出完全相反建议的答案,但当然有添加的上下文。我有责任尽可能有效地沟通,但我也可以接受被误解。我并不总是有时间为我所说的一切提供引用和参考文献,但这也没关系。有了这样的答案(除了一段代码和零解释),我觉得有义务帮助推动另一个方向,让读者知道一个特定的答案不会不受反对——即使这种努力只比答案稍大一些。 (2认同)

小智 12

A.splice(0);

我刚刚在我正在处理的一些代码上做了这个.它清除了阵列.


Ali*_*eza 12

您可以轻松创建一个函数来为您执行此操作,更改长度,甚至将其添加到本机Array作为remove()重用函数.

想象一下你有这个数组:

var arr = [1, 2, 3, 4, 5]; //the array
Run Code Online (Sandbox Code Playgroud)

好的,只需运行:

arr.length = 0; //change the length
Run Code Online (Sandbox Code Playgroud)

结果是:

[] //result
Run Code Online (Sandbox Code Playgroud)

清空阵列的简单方法......

也使用循环,这是不必要的,但只是另一种方式:

/* could be arr.pop() or arr.splice(0)
don't need to return as main array get changed */

function remove(arr) {
  while(arr.length) {
    arr.shift(); 
  }
}
Run Code Online (Sandbox Code Playgroud)

您还可以考虑一些棘手的方法,例如:

arr.splice(0, arr.length); //[]
Run Code Online (Sandbox Code Playgroud)

因此,如果arr有5个项目,它将从0拼接5个项目,这意味着数组中不会保留任何内容.

还有其他方法,例如简单地重新分配数组:

arr = []; //[]
Run Code Online (Sandbox Code Playgroud)

如果您查看数组函数,还有许多其他方法可以执行此操作,但最推荐的方法可能是更改长度.

正如我先说的那样,你也可以原型remove(),因为它是你问题的答案.您可以简单地选择上述方法之一并将其原型化为JavaScript中的Array对象,例如:

Array.prototype.remove = Array.prototype.remove || function() {
  this.splice(0, this.length);
};
Run Code Online (Sandbox Code Playgroud)

你可以简单地调用它来清空你的javascript应用程序中的任何数组:

arr.remove(); //[]
Run Code Online (Sandbox Code Playgroud)


Lax*_*nge 11

如果你正在使用

a = []; 
Run Code Online (Sandbox Code Playgroud)

然后你将一个新的数组引用分配给a,如果a中的引用已经分配给任何其他变量,那么它也不会清空该数组,因此垃圾收集器不会收集该内存.

对于前者

var a=[1,2,3];
var b=a;
a=[];
console.log(b);// It will print [1,2,3];
Run Code Online (Sandbox Code Playgroud)

要么

a.length = 0;
Run Code Online (Sandbox Code Playgroud)

当我们指定时a.length,我们只是重置数组的边界,而rest数组元素的内存将由垃圾收集器连接.

而不是这两种解决方案更好.

a.splice(0,a.length)
Run Code Online (Sandbox Code Playgroud)

while(a.length > 0) {
    a.pop();
}
Run Code Online (Sandbox Code Playgroud)

根据kenshou.html之前的回答,第二种方法更快.

  • 除了'a.length`上的错误之外,我不知道这个新答案会给线程增加什么? (9认同)
  • `var a = [1]; var b = a; a.长度=0;console.log(b)` 打印 `Array [ ]`,所以对我来说它似乎没有创建一个新数组。 (2认同)

css*_*sek 9

使用Jan的初步建议的修改版本:

var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要做这样的事情?为什么要添加两个变量和一堆代码来做同样的事情? (12认同)

Yas*_*ash 6

在此处输入图片说明

要清空数组的当前内存位置,请使用:'myArray.length = 0''myArray.pop() UN-till its length is 0'

  • length:您可以随时设置长度属性来截断数组。当您通过更改长度属性来扩展数组时,实际元素的数量会增加。
  • pop() : pop 方法从数组中删除最后一个元素并返回返回删除的值。
  • shift(): shift 方法移除第零个索引处的元素并将连续索引处的值向下移动,然后返回移除的值。

例子:

var arr = ['77'];
arr.length = 20;
console.log("Increasing : ", arr); // (20) ["77", empty × 19]
arr.length = 12;
console.log("Truncating : ", arr); // (12) ["77", empty × 11]

var mainArr = new Array();
mainArr = ['1', '2', '3', '4'];

var refArr = mainArr;
console.log('Current', mainArr, 'Refered', refArr);

refArr.length = 3;
console.log('Length: ~ Current', mainArr, 'Refered', refArr);

mainArr.push('0');
console.log('Push to the End of Current Array Memory Location \n~ Current', mainArr, 'Refered', refArr);

mainArr.poptill_length(0);
console.log('Empty Array \n~ Current', mainArr, 'Refered', refArr);

Array.prototype.poptill_length = function (e) {
  while (this.length) {
    if( this.length == e ) break;

    console.log('removed last element:', this.pop());
  }
};
Run Code Online (Sandbox Code Playgroud)
  • new Array() | [] 使用Array constructor或创建具有新内存位置的数组array literal

    mainArr = []; // a new empty array is addressed to mainArr.
    
    var arr = new Array('10'); // Array constructor
    arr.unshift('1'); // add to the front
    arr.push('15'); // add to the end
    console.log("After Adding : ", arr); // ["1", "10", "15"]
    
    arr.pop(); // remove from the end
    arr.shift(); // remove from the front
    console.log("After Removing : ", arr); // ["10"]
    
    var arrLit = ['14', '17'];
    console.log("array literal « ", indexedItem( arrLit ) ); // {0,14}{1,17}
    
    function indexedItem( arr ) {
        var indexedStr = "";
        arr.forEach(function(item, index, array) {
            indexedStr += "{"+index+","+item+"}";
            console.log(item, index);
        });
        return indexedStr;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • slice() :通过使用 slice 函数,我们从原始数组中获取元素的浅拷贝,具有新的内存地址,因此对 cloneArr 的任何修改都不会影响实际|原始数组。

    var shallowCopy = mainArr.slice(); // this is how to make a copy
    
    var cloneArr = mainArr.slice(0, 3); 
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
    cloneArr.length = 0; // Clears current memory location of an array.
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
    Run Code Online (Sandbox Code Playgroud)


Dam*_*ica 6

如果你使用常量,那么你别无选择:

const numbers = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

你不能重新签名:

numbers = []
Run Code Online (Sandbox Code Playgroud)

你只能截断:

numbers.length = 0
Run Code Online (Sandbox Code Playgroud)


Cau*_*ite 5

我很惊讶还没有人提出这个建议:

let xs = [1,2,3,4];
for (let i in xs)
    delete xs[i];
Run Code Online (Sandbox Code Playgroud)

这会产生一个与其他解决方案处于完全不同状态的数组。从某种意义上说,数组已被“清空”:

xs
=> Array [ <4 empty slots> ]

[...xs]
=> Array [ undefined, undefined, undefined, undefined ]

xs.length
=> 4

xs[0]
=> ReferenceError: reference to undefined property xs[0]
Run Code Online (Sandbox Code Playgroud)

[,,,,]您可以使用或生成等效数组Array(4)

  • 这可能是另一个问题的一个很好的答案:“如何将数组中的所有元素转换为未定义的元素”。 (7认同)