diff --git a/lodash.js b/lodash.js index 69cf59b73..d20a62a2b 100644 --- a/lodash.js +++ b/lodash.js @@ -10904,7 +10904,7 @@ * @memberOf _ * @category Number * @param {number} number The number whose value is to be limited. - * @param {number} min The minimum possible value. + * @param {number} [min] The minimum possible value. * @param {number} max The maximum possible value. * @returns {number} A number in the range [min, max]. * @example @@ -10916,7 +10916,19 @@ * // => 5 */ function clamp(number, min, max) { - return nativeMin(nativeMax(number, min), max); + if (max === undefined) { + max = min; + min = undefined; + } + if (max !== undefined) { + max = +max; + number = nativeMin(number, max === max ? max : 0); + } + if (min !== undefined) { + min = +min; + number = nativeMax(number, min === min ? min : 0); + } + return number; } /** diff --git a/test/test.js b/test/test.js index 91b6298a7..87c701285 100644 --- a/test/test.js +++ b/test/test.js @@ -2055,7 +2055,7 @@ assert.strictEqual(_.clamp(-5.5, -5.6, 5.6), -5.5); }); - QUnit.test('should not alter positive numbers in range`', function(assert) { + QUnit.test('should not alter positive numbers in range', function(assert) { assert.expect(3); assert.strictEqual(_.clamp(4, -5, 5), 4); @@ -2063,38 +2063,41 @@ assert.strictEqual(_.clamp(4.5, -5.1, 5.2), 4.5); }); - QUnit.test('should not alter positive zero in range', function(assert) { + QUnit.test('should not alter `0` in range', function(assert) { assert.expect(1); - assert.strictEqual(1 / _.clamp(0, -5, 5), 1 / 0); + assert.strictEqual(1 / _.clamp(0, -5, 5), Infinity); }); - QUnit.test('should clamp to positive zero', function(assert) { + QUnit.test('should clamp to `0`', function(assert) { assert.expect(1); - assert.strictEqual(1 / _.clamp(-10, 0, 5), 1 / 0); + assert.strictEqual(1 / _.clamp(-10, 0, 5), Infinity); }); - QUnit.test('should not alter negative zero in range', function(assert) { + QUnit.test('should not alter `-0` in range', function(assert) { assert.expect(1); - assert.strictEqual(1 / _.clamp(-0, -5, 5), 1 / -0); + assert.strictEqual(1 / _.clamp(-0, -5, 5), -Infinity); }); - QUnit.test('should clamp to negative zero', function(assert) { + QUnit.test('should clamp to `-0`', function(assert) { assert.expect(1); - assert.strictEqual(1 / _.clamp(-10, -0, 5), 1 / -0); + assert.strictEqual(1 / _.clamp(-10, -0, 5), -Infinity); }); - QUnit.test('should return NaN if an argument is or is coerced to NaN', function(assert) { - assert.expect(5); + QUnit.test('should return `NaN` when `number` is `NaN`', function(assert) { + assert.expect(1); assert.deepEqual(_.clamp(NaN, -5, 5), NaN); - assert.deepEqual(_.clamp(Infinity, -5, NaN), NaN); - assert.deepEqual(_.clamp(-Infinity, -5, NaN), NaN); - assert.deepEqual(_.clamp(Infinity, NaN, 5), NaN); - assert.deepEqual(_.clamp(-Infinity, NaN, 5), NaN); + }); + + QUnit.test('should coerce `min` and `max` of `NaN` to `0`', function(assert) { + assert.expect(2); + + assert.deepEqual(_.clamp(1, -5, NaN), 0); + assert.deepEqual(_.clamp(-1, NaN, 5), 0); }); }());