【发布时间】:2017-09-28 11:16:07
【问题描述】:
我在尝试扩展 Array.prototype 时注意到了一些事情。我本质上是想写一个允许删除数组中最后一项的方法:
Array.prototype.removeLast = function() {
delete this[this.length - 1];
};
这不会产生我预期的结果:
>>> var arr = [ 1, 2, 3 ];
[ 1, 2, 3 ]
>>> arr.removeLast();
undefined
>>> arr
[ 1, 2, undefined ]
所以我尝试了另一种方法:
Array.prototype.removeLast = function() {
this.length--;
};
我得到了预期的结果。
>>> var arr = [ 1, 2, 3 ];
[ 1, 2, 3 ]
>>> arr.removeLast();
undefined
>>> arr
[ 1, 2 ]
问题
1) 为什么数组索引删除不像对象键删除那样操作? (对于数组,引用似乎仍然存在,但只是引用了undefined。对于对象,引用似乎被完全删除了。)
2) this.length-- 方法安全吗?是否会导致内存泄漏,或者确实
更改对象的 length 属性也会导致运行检查并删除数组中任何被遗忘的索引?
3) 前两个问题的答案是否因实施而异?
4) removeLast 的好的实现是什么?
谢谢!
【问题讨论】:
-
首先你不应该改变 Array 原型。其次,
delete删除给定索引上的对象,但不更改数组的长度。第三,它有原生的更好的函数,比如pop()或splice(),它们会改变数组的结构。 -
3) 和 4) 在 1) 和 2) 中回答
-
虽然是一个很好的参考(从 2012 年开始),但重要的是要注意 (1) 引用了旧的 ECMA 标准,此外,虽然标准有助于定义期望,但它通常不会定义某些东西是如何实现的(浏览器当标准不具体时表现不同),或者在将某个功能纳入标准之前包含该功能。
标签: javascript arrays