From deb65de218ef0cc0e117840f70a9e70cbb960698 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Tue, 9 Jul 2019 09:29:54 -0700 Subject: [PATCH] Revert "perf(toNumber): use +value to convert binary/octal/hexadecimal string (#4230)" This reverts commit 7084300d3420d2b3c45fa1e9c19dedcd2ba4b97c. --- lodash.js | 18 ++++++++++++++++-- test/test.js | 6 +++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lodash.js b/lodash.js index f60bbd95e..7919e5325 100644 --- a/lodash.js +++ b/lodash.js @@ -177,9 +177,18 @@ /** Used to match `RegExp` flags from their coerced string values. */ var reFlags = /\w*$/; + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; @@ -400,7 +409,8 @@ }; /** Built-in method references without a dependency on `root`. */ - var freeParseFloat = parseFloat; + var freeParseFloat = parseFloat, + freeParseInt = parseInt; /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; @@ -12458,7 +12468,11 @@ if (typeof value != 'string') { return value === 0 ? value : +value; } - return +value; + value = value.replace(reTrim, ''); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); } /** diff --git a/test/test.js b/test/test.js index fec06dda4..e20280a0c 100644 --- a/test/test.js +++ b/test/test.js @@ -23598,9 +23598,9 @@ QUnit.test('`_.' + methodName + '` should convert binary/octal strings to numbers', function(assert) { assert.expect(1); - var numbers = [42, 5349, 1715004, 63, 42798, 27440068], + var numbers = [42, 5349, 1715004], transforms = [identity, pad], - values = ['0b101010', '0o12345', '0x1a2b3c', ' 0b111111 ', ' 0o123456 ', ' 0x1a2b3c4 ' ]; + values = ['0b101010', '0o12345', '0x1a2b3c']; var expected = lodashStable.map(numbers, function(n) { return lodashStable.times(8, lodashStable.constant(n)); @@ -23620,7 +23620,7 @@ assert.expect(1); var transforms = [identity, pad, positive, negative], - values = ['0b', '0o', '0x', '0b1010102', '0o123458', '0x1a2b3x', '+0b101010', '+0o12345', '+0x1a2b3c']; + values = ['0b', '0o', '0x', '0b1010102', '0o123458', '0x1a2b3x']; var expected = lodashStable.map(values, function(n) { return lodashStable.times(8, lodashStable.constant(isToNumber ? NaN : 0));