Source: core/shim/array.js

/**
 * Defines standardized shims to intrinsic `Array` object.
 * @see {external:Array}
 * @module montage/core/shim/array
 */

/**
 * @external Array
 */

/**
 * Returns whether the given value is an array, regardless of which
 * context it comes from.  The context may be another frame.
 *
 * This is the proper idiomatic way to test whether an object is an
 * array and replaces the less generally useful `instanceof`
 * check (which does not work across contexts) and the strangeness that
 * the `typeof` an array is `"object"`.
 *
 * @function external:Array.isArray
 * @param {Any} value any value
 * @returns {boolean} whether the given value is an array
 */
if (!Array.isArray) {
    Object.defineProperty(Array, "isArray", {
        value: function (obj) {
            return Object.prototype.toString.call(obj) === "[object Array]";
        },
        writable: true,
        configurable: true
    });
}

/**
 *  Compacts a sparse array.
 *
 *  @function external:Date#clone
 *  @returns {Date} - a new date
*/
Object.defineProperty(Array.prototype,"compact", {
    value: function () {
        var u, i=-1, j=-1,length=this.length;
        while(++j<length) {
            if((this[j] !== u)) { 
                this[++i]=this[j];
            }
        }
        this.length=++i;
    },
    writable: true,
    configurable: true

});

/**
 *  Remove Objects.
 *
 *  @function external:Date#clone
 *  @returns {Date} - a new date
*/
Object.defineProperty(Array.prototype,"removeObjects", {
    value: function (objects, clearRemovedObjects) {
        var u, i=-1, j=-1,length=this.length, hasMethod, index, indexCount = 0;
        clearRemovedObjects = arguments.length === 2 ? clearRemovedObjects : true;
        if(typeof objects.has === "function") {
            while(++j<length) {
                if(!(objects.has(this[j]))) {
                    this[++i]=this[j];
                }
                else if(clearRemovedObjects) {
                    objects.delete(this[j]);
                }
            }
        } else if(typeof objects.hasOwnProperty === "function") {
            while(++j<length) {
                if(!(objects.hasOwnProperty(this[j]))) {
                    this[++i]=this[j];
                } else if(clearRemovedObjects) {
                    delete objects[this[j]];
                }
            }
        } else if(typeof objects.indexOf === "function") {
            while(++j<length) {
                if((index = objects.indexOf(this[j])) === -1) {
                    this[++i]=this[j];
                } else {
                    objects[index] = u;
                    indexCount++;
                }
            }
            if(objects.length === indexCount) {
                objects.length = 0;
            } else {
                objects.compact();
            }
        }
        this.length=++i;
    },
    writable: true,
    configurable: true
});