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;
}
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);
var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
A.pop();
}
69
清除现有数组的方法 A :
Method 1
(这是我对问题的原始答案)
A = [];
此代码将变量 A 设置为新的空数组 . 如果你在其他任何地方没有 references to the original array 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']
如果您对内存分配感兴趣,可以使用this jsfiddle和chrome dev工具' timeline tab. You will want to use the trash bin icon at the bottom to force a garbage collection after '_清除' the array. This should give you a more definite answer for the browser of your choice. A lot of answers here are old and I wouldn' t依赖它们来比较每种方法,而不是像@ tanguy_k上面的答案那样进行测试 .
18 回答
要清空数组的当前内存位置,请使用:
'myArray.length = 0'
或'myArray.pop() UN-till its length is 0'
length:您可以设置length属性以随时截断数组 . 通过更改其length属性来扩展数组时,实际元素的数量会增加 .
pop():pop方法从数组中删除 last 元素并返回返回已删除的值 .
shift():shift方法删除 zeroeth index 处的元素并将连续索引处的值向下移动,然后返回删除的值 .
例:
Array constructor
或array literal
创建具有新内存位置的阵列 .您可以将其添加到JavaScript文件中以允许“清除”数组:
然后你可以像这样使用它:
或者如果你想确定你没有破坏某些东西:
很多人认为你不应该修改原生对象(比如Array),我倾向于同意 . 请谨慎决定如何处理此问题 .
如果您需要保留原始数组,因为您还有其它应该更新的引用,您可以通过将其长度设置为零来清除它而不创建新数组:
A.splice(0);
我刚刚在我正在处理的一些代码上做了这个 . 它清除了阵列 .
关于while; pop / shift表现在答案和评论中存在很多混乱和错误信息 . while / pop解决方案(如预期的那样) worst performance . 实际发生的情况是,对于在循环中运行代码段的每个样本,安装程序只运行一次 . 例如:
我创建了一个正常工作的新测试:
http://jsperf.com/empty-javascript-array-redux
Warning: 即使在此版本的测试中,您也无法真正看到真正的差异,因为克隆数组会占用大部分测试时间 . 它仍然显示
splice
是清除阵列的最快方法(不考虑[]
,因为它是最快的,它实际上并没有清除现有阵列) .我很惊讶没有人提出这个建议:
这产生了与其他解决方案完全不同的阵列 . 从某种意义上说,阵列已被“清空”:
您可以使用
[,,,,]
或Array(4)
生成等效数组使用Jan的初步建议的修改版本:
清除现有数组的方法
A
:Method 1
(这是我对问题的原始答案)
此代码将变量
A
设置为新的空数组 . 如果你在其他任何地方没有 references to the original array A ,这是完美的,因为这实际上创建了一个全新的(空)数组 . 您应该小心使用此方法,因为如果您从另一个变量或属性引用此数组,原始数组将保持不变 . 仅当您仅通过其原始变量A
引用数组时才使用此选项 .这也是最快的解决方案 .
此代码示例显示了使用此方法时可能遇到的问题:
Method 2 (suggested by Matthew Crumley)
这将通过将其长度设置为0来清除现有数组 . 有些人认为这可能不适用于JavaScript的所有实现,但事实证明并非如此 . 它在ECMAScript 5中使用“严格模式”时也有效,因为数组的length属性是读/写属性 .
Method 3 (suggested by Anthony)
使用
.splice()
将完美地工作,但由于.splice()
函数将返回包含所有已删除项的数组,因此它实际上将返回原始数组的副本 . 基准测试表明,这对绩效没有任何影响 .Method 4 (suggested by tanguy_k)
这个解决方案不是很简洁,它也是最慢的解决方案,与原始答案中引用的早期基准相反 .
Performance
在清除 existing array 的所有方法中,方法2和3在性能上非常相似,并且比方法4快得多 . 请参见benchmark .
正如Diadistis在下面的answer中指出的那样,用于确定上述四种方法的性能的原始基准是有缺陷的 . 原始基准重用了清除的数组,因此第二次迭代清除了一个已经为空的数组 .
以下基准修复了这个缺陷:http://jsben.ch/#/hyj65 . 它清楚地表明方法#2(长度属性)和#3(拼接)是最快的(不计算方法#1不改变原始数组) .
这一直是一个热门话题和事业很多争议 . 实际上有很多正确的答案,并且由于这个答案在很长一段时间内已被标记为已接受的答案,因此我将在此处包含所有方法 . 如果您投票赞成此答案,请同时提及我所引用的其他答案 .
到目前为止2739投票的答案都是误导和错误的 .
问题是:"How do you empty your existing array?"例如为
A = [1,2,3,4]
.A = []
就是答案”是无知的,绝对不正确 .[] == []
是 false .这是因为这两个数组是两个独立的,单独的对象,具有自己的两个身份,在数字世界中占据了自己的空间,每个都独立存在 .
假设您的母亲要求您清空垃圾桶 .
你没有完成你所要求的工作 .
而是清空垃圾桶 .
你不要从填充的 jar 里取出标签"A"并将其粘贴到新的标签
A = [1,2,3,4]; A = [];
清空数组对象是最简单的事情:
这样,“A”下的can不仅是空的,而且还像新的一样干净!
不,你被要求清空它:
这是唯一正确清空给定JavaScript数组内容的代码 .
您可以轻松创建一个函数来为您执行此操作,更改 length 甚至将其添加到 native Array 作为
remove()
函数以供重用 .想象一下你有这个数组:
好的,只需运行:
结果是:
清空阵列的简单方法......
还使用循环,这是不必要的,但只是另一种方式:
您还可以考虑一些棘手的方法,例如:
因此,如果arr有5个项目,它将从0拼接5个项目,这意味着数组中不会保留任何内容 .
还有其他方法,例如简单地重新分配数组:
如果您查看数组函数,还有许多其他方法可以执行此操作,但最推荐的方法可能是更改长度 .
正如我先说的那样,你也可以将remove()原型化,因为它是你问题的答案 . 您可以简单地选择上述方法之一并将其原型化为JavaScript中的Array对象,例如:
你可以简单地调用它来清空你的javascript应用程序中的任何数组:
并称之为:
array.clear();
更加跨浏览器友好且更优化的解决方案是使用
splice
方法清空数组A的内容,如下所示:A.splice(0, A.length);
性能测试:
http://jsperf.com/array-clear-methods/3
如果你正在使用
然后你将一个新的数组引用分配给a,如果a中的引用已经分配给任何其他变量,那么它也不会清空该数组,因此垃圾收集器不会收集该内存 .
对于前者
要么
当我们指定
a.length
时,我们只是重置数组的边界,而rest数组元素的内存将由垃圾收集器连接 .而不是这两种解决方案更好 .
和
根据kenshou.html之前的回答,第二种方法更快 .
这里是 keeping the same array ("mutable")最快的工作实现:
仅供参考Map定义了
clear()
所以对于Array来说也是合乎逻辑的clear()
.或者作为Underscore.js mixin:
或者一个简单的功能:
TypeScript版本:
仅供参考,它不能简化为
while (array.pop())
:测试将失败 .以及随之而来的测试:
这里更新的jsPerf:http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152
如果你使用常量,那么你别无选择:
你不能重新签名:
你只能截断:
如果您对内存分配感兴趣,可以使用this jsfiddle和chrome dev工具' timeline tab. You will want to use the trash bin icon at the bottom to force a garbage collection after '_清除' the array. This should give you a more definite answer for the browser of your choice. A lot of answers here are old and I wouldn' t依赖它们来比较每种方法,而不是像@ tanguy_k上面的答案那样进行测试 .
(有关上述标签的介绍,您可以查看here)
Stackoverflow强迫我复制jsfiddle所以这里是:
您应该注意它可能取决于数组元素的类型,因为javascript管理字符串的方式与其他基本类型不同,更不用说对象数组了 . 类型可能会影响发生的事情 .
如果您需要清空Angular 2 FormArray,请在下方使用 .