function packRanges(fromIndex, toIndex, bucketThreshold, sparseIterationThreshold, getOwnPropertyNamesThreshold)
    {
        var ownPropertyNames = null;
        var consecutiveRange = (toIndex - fromIndex >= sparseIterationThreshold) && ArrayBuffer.isView(this);
        var skipGetOwnPropertyNames = consecutiveRange && (toIndex - fromIndex >= getOwnPropertyNamesThreshold);

        function* arrayIndexes(object)
        {
            if (toIndex - fromIndex < sparseIterationThreshold) {
                for (var i = fromIndex; i <= toIndex; ++i) {
                    if (i in object)
                        yield i;
                }
            } else {
                ownPropertyNames = ownPropertyNames || Object.getOwnPropertyNames(object);
                for (var i = 0; i < ownPropertyNames.length; ++i) {
                    var name = ownPropertyNames[i];
                    var index = name >>> 0;
                    if (("" + index) === name && fromIndex <= index && index <= toIndex)
                        yield index;
                }
            }
        }

        var count = 0;
        if (consecutiveRange) {
            count = toIndex - fromIndex + 1;
        } else {
            for (var i of arrayIndexes(this))
                ++count;
        }

        var bucketSize = count;
        if (count <= bucketThreshold)
            bucketSize = count;
        else
            bucketSize = Math.pow(bucketThreshold, Math.ceil(Math.log(count) / Math.log(bucketThreshold)) - 1);

        var ranges = [];
        if (consecutiveRange) {
            for (var i = fromIndex; i <= toIndex; i += bucketSize) {
                var groupStart = i;
                var groupEnd = groupStart + bucketSize - 1;
                if (groupEnd > toIndex)
                    groupEnd = toIndex;
                ranges.push([groupStart, groupEnd, groupEnd - groupStart + 1]);
            }
        } else {
            count = 0;
            var groupStart = -1;
            var groupEnd = 0;
            for (var i of arrayIndexes(this)) {
                if (groupStart === -1)
                    groupStart = i;
                groupEnd = i;
                if (++count === bucketSize) {
                    ranges.push([groupStart, groupEnd, count]);
                    count = 0;
                    groupStart = -1;
                }
            }
            if (count > 0)
                ranges.push([groupStart, groupEnd, count]);
        }

        return { ranges: ranges, skipGetOwnPropertyNames: skipGetOwnPropertyNames };
    }
function packRanges(fromIndex, toIndex, bucketThreshold, sparseIterationThreshold, getOwnPropertyNamesThreshold)
    {
        var ownPropertyNames = null;
        var consecutiveRange = (toIndex - fromIndex >= sparseIterationThreshold) && ArrayBuffer.isView(this);
        var skipGetOwnPropertyNames = consecutiveRange && (toIndex - fromIndex >= getOwnPropertyNamesThreshold);

        function* arrayIndexes(object)
        {
            if (toIndex - fromIndex < sparseIterationThreshold) {
                for (var i = fromIndex; i <= toIndex; ++i) {
                    if (i in object)
                        yield i;
                }
            } else {
                ownPropertyNames = ownPropertyNames || Object.getOwnPropertyNames(object);
                for (var i = 0; i < ownPropertyNames.length; ++i) {
                    var name = ownPropertyNames[i];
                    var index = name >>> 0;
                    if (("" + index) === name && fromIndex <= index && index <= toIndex)
                        yield index;
                }
            }
        }

        var count = 0;
        if (consecutiveRange) {
            count = toIndex - fromIndex + 1;
        } else {
            for (var i of arrayIndexes(this))
                ++count;
        }

        var bucketSize = count;
        if (count <= bucketThreshold)
            bucketSize = count;
        else
            bucketSize = Math.pow(bucketThreshold, Math.ceil(Math.log(count) / Math.log(bucketThreshold)) - 1);

        var ranges = [];
        if (consecutiveRange) {
            for (var i = fromIndex; i <= toIndex; i += bucketSize) {
                var groupStart = i;
                var groupEnd = groupStart + bucketSize - 1;
                if (groupEnd > toIndex)
                    groupEnd = toIndex;
                ranges.push([groupStart, groupEnd, groupEnd - groupStart + 1]);
            }
        } else {
            count = 0;
            var groupStart = -1;
            var groupEnd = 0;
            for (var i of arrayIndexes(this)) {
                if (groupStart === -1)
                    groupStart = i;
                groupEnd = i;
                if (++count === bucketSize) {
                    ranges.push([groupStart, groupEnd, count]);
                    count = 0;
                    groupStart = -1;
                }
            }
            if (count > 0)
                ranges.push([groupStart, groupEnd, count]);
        }

        return { ranges: ranges, skipGetOwnPropertyNames: skipGetOwnPropertyNames };
    }
function packRanges ( fromIndex , toIndex , bucketThreshold , sparseIterationThreshold , getOwnPropertyNamesThreshold ) { var ownPropertyNames = null ; var consecutiveRange = ( toIndex - fromIndex >= sparseIterationThreshold ) && ArrayBuffer . isView ( this ) ; var skipGetOwnPropertyNames = consecutiveRange && ( toIndex - fromIndex >= getOwnPropertyNamesThreshold ) ; function * arrayIndexes ( object ) { if ( toIndex - fromIndex < sparseIterationThreshold ) { for ( var i = fromIndex ; i <= toIndex ; ++ i ) { if ( i in object ) yield i ; } } else { ownPropertyNames = ownPropertyNames || Object . getOwnPropertyNames ( object ) ; for ( var i = 0 ; i < ownPropertyNames . length ; ++ i ) { var name = ownPropertyNames [ i ] ; var index = name >>> 0 ; if ( ( "" + index ) === name && fromIndex <= index && index <= toIndex ) yield index ; } } } var count = 0 ; if ( consecutiveRange ) { count = toIndex - fromIndex + 1 ; } else { for ( var i of arrayIndexes ( this ) ) ++ count ; } var bucketSize = count ; if ( count <= bucketThreshold ) bucketSize = count ; else bucketSize = Math . pow ( bucketThreshold , Math . ceil ( Math . log ( count ) / Math . log ( bucketThreshold ) ) - 1 ) ; var ranges = [ ] ; if ( consecutiveRange ) { for ( var i = fromIndex ; i <= toIndex ; i += bucketSize ) { var groupStart = i ; var groupEnd = groupStart + bucketSize - 1 ; if ( groupEnd > toIndex ) groupEnd = toIndex ; ranges . push ( [ groupStart , groupEnd , groupEnd - groupStart + 1 ] ) ; } } else { count = 0 ; var groupStart = - 1 ; var groupEnd = 0 ; for ( var i of arrayIndexes ( this ) ) { if ( groupStart === - 1 ) groupStart = i ; groupEnd = i ; if ( ++ count === bucketSize ) { ranges . push ( [ groupStart , groupEnd , count ] ) ; count = 0 ; groupStart = - 1 ; } } if ( count > 0 ) ranges . push ( [ groupStart , groupEnd , count ] ) ; } return { ranges : ranges , skipGetOwnPropertyNames : skipGetOwnPropertyNames } ; }
Note: must declare params as optional.
@param {number=} fromIndex
@param {number=} toIndex
@param {number=} bucketThreshold
@param {number=} sparseIterationThreshold
@param {number=} getOwnPropertyNamesThreshold
@suppressReceiverCheck
@this {Object}
Note : must declare params as optional .