我正在使用myarray.length = 0
方法通过自定义Array.prototype.clear()
方法截断数组。
到目前为止,据我所知这已经奏效了,但我现在有一个特殊情况,它将length
设置为0
,但元素仍然存在。
我已经运行了一个基本的阵列测试,它似乎可行,但在这个更复杂的情况下,它不是,所以很难诊断问题。
以下是我使用的Array.prototype
上的扩展程序代码...
Object.defineProperty(Array.prototype, 'clear', {
value: function clear() {
// Clear the array using the length = 0 method. See the method's comments on links to more information and benchmarks on this technique.
this.length = 0;
},
enumerable: false,
configurable: true,
writable: false
});
当我在所有其他情况下调用它时,以下工作非常出色。
var myarray = [ 1,2,3,4,5,6,6,7,8,9, new Date() ];
myarray.clear();
console.log(myarray); // all cleared. { length: 0 }
但是在我更复杂的情况下,数组有大约10-20个元素并且我在数组上调用.clear()
,它将长度设置为0
但是如果我仍然可以看到元素像我上面那样console.log
数组。
// e.g. { 0: ..., 1: ..., 2: ..., 3: ..., 4: ..., length: 0 }
唯一的区别是我使用的Array
对象是扩展对象,带有覆盖, 调用覆盖的函数。像这样......
function Collection() { Array.apply(this); }
Collection.prototype = Object.create(Array.prototype, {
push: {
enumerable: false,
value: function(item) {
// ...does a type checks on 'item'
Array.prototype.push.apply(this, [ item ]);
}
},
clear: {
enumerable: false,
value: function() { Array.prototype.clear.apply(this); }
}
});
这种情况在Chrome中发生,我已经将其逐步推向了Array.prototype.clear
方法,就像我的测试一样,但由于某些原因它在第二种情况下不起作用。
有什么想法吗?
答案 0 :(得分:2)
如果您使用新的ES2015 + class
Object.defineProperty(Array.prototype, 'clear', {
value: function clear() {
this.length = 0;
},
enumerable: false,
configurable: true,
writable: false
});
class Collection extends Array {
constructor(...args) {
super(...args);
}
push(...args) {
console.log('overridden push', ...args);
// only push even values for example
super.push(...args.filter(x=>x%2 == 0));
}
}
var x = new Collection();
x.push(1,2,3,4);
console.log('after push', JSON.stringify(x));
x.clear();
console.log('after clear', JSON.stringify(x));

或者您可以避免向阵列添加清除
class Collection extends Array {
constructor(...args) {
super(...args);
}
push(...args) {
console.log('overridden push', ...args);
// only push even values for example
super.push(...args.filter(x=>x%2 == 0));
}
clear() {
this.length = 0;
}
}
var x = new Collection();
x.push(1,2,3,4);
console.log('after push', JSON.stringify(x));
x.clear();
console.log('after clear', JSON.stringify(x));