通过将长度设置为0来截断Javascript中的数组不起作用

时间:2017-09-29 04:42:52

标签: javascript arrays

我正在使用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方法,就像我的测试一样,但由于某些原因它在第二种情况下不起作用。

有什么想法吗?

1 个答案:

答案 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));