diff --git a/lodash.js b/lodash.js index fee83a99e..947eba459 100644 --- a/lodash.js +++ b/lodash.js @@ -968,7 +968,8 @@ /** Used as references for the max length and index of an array. */ var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1, - MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1; + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; /** Used as the size, in bytes, of each Float64Array element. */ var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0; @@ -2753,7 +2754,7 @@ high = array ? array.length : low; value = iteratee(value); - if (value !== value || typeof value == 'undefined' || high > (MAX_ARRAY_LENGTH / 2)) { + if (value !== value || typeof value == 'undefined' || high > HALF_MAX_ARRAY_LENGTH) { return baseBinaryIndex(array, value, iteratee, retHighest); } while (low < high) { diff --git a/test/test.js b/test/test.js index e844b6f29..88850c0ff 100644 --- a/test/test.js +++ b/test/test.js @@ -11151,22 +11151,23 @@ }); }); - test('`_.' + methodName + '` should support arrays larger than `Math.pow(2, 31) - 1`', 2, function() { - var array = [0], - length = MAX_ARRAY_LENGTH, - steps = 0; + test('`_.' + methodName + '` should support arrays larger than `MAX_ARRAY_LENGTH / 2`', 4, function() { + _.each([Math.ceil(MAX_ARRAY_LENGTH / 2), MAX_ARRAY_LENGTH], function(length, index) { + var array = [], + steps = 0; - array.length = length; + array.length = length; - // Avoid false fails in older Firefox. - if (array.length == length) { - var actual = func(array, undefined, function() { steps++; }); - strictEqual(steps, 33); - strictEqual(actual, isSortedIndex ? 0 : MAX_ARRAY_INDEX); - } - else { - skipTest(2); - } + // Avoid false fails in older Firefox. + if (array.length == length) { + var actual = func(array, undefined, function() { steps++; }); + strictEqual(steps, isSortedIndex ? 33 : (32 + index)); + strictEqual(actual, isSortedIndex ? 0 : Math.min(length, MAX_ARRAY_INDEX)); + } + else { + skipTest(2); + } + }); }); });