diff --git a/lodash.js b/lodash.js index a5344d55d..8238c92ff 100644 --- a/lodash.js +++ b/lodash.js @@ -119,6 +119,11 @@ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source); + /** Used to match leading and trailing whitespace. */ + var reTrim = /^\s+|\s+$/g, + reTrimStart = /^\s+/, + reTrimEnd = /\s+$/; + /** Used to match backslashes in property paths. */ var reEscapeChar = /\\(\\)?/g; @@ -842,20 +847,6 @@ }); } - /** - * The base implementation of `_.trim` without support trimming non-whitespace - * characters. - * - * @private - * @param {string} string The string to trim. - * @returns {string} Returns the trimmed string. - */ - function baseTrim(string) { - return string - ? string.slice(trimmedStartIndex(string), trimmedEndIndex(string) + 1) - : string; - } - /** * The base implementation of `_.unary` without support for storing wrapper metadata. * @@ -1090,19 +1081,6 @@ return value > -1 && value % 1 == 0 && value < length; } - /** - * Used by `trimmedStartIndex` and `trimmedEndIndex` to determine if a - * character code is whitespace. - * - * @private - * @param {number} charCode The character code to inspect. - * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`. - */ - function isSpace(charCode) { - return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 || - (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279))); - } - /** * Converts `iterator` to an array. * @@ -1206,37 +1184,6 @@ return string.match(reComplexSymbol); } - /** - * Used by `_.trim` and `_.trimStart` to get the index of the first non-whitespace - * character of `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the index of the first non-whitespace character. - */ - function trimmedStartIndex(string) { - var index = -1, - length = string.length; - - while (++index < length && isSpace(string.charCodeAt(index))) {} - return index; - } - - /** - * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace - * character of `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the index of the last non-whitespace character. - */ - function trimmedEndIndex(string) { - var index = string.length; - - while (index-- && isSpace(string.charCodeAt(index))) {} - return index; - } - /** * Used by `_.unescape` to convert HTML entities to characters. * @@ -10293,7 +10240,7 @@ if (typeof value == 'number' || !isString(value)) { return +value; } - value = baseTrim(value); + value = value.replace(reTrim, ''); var isBinary = reIsBinary.test(value); return (isBinary || reIsOctal.test(value)) ? nativeParseInt(value.slice(2), isBinary ? 2 : 8) @@ -12127,7 +12074,7 @@ } else if (radix) { radix = +radix; } - string = baseTrim(toString(string)); + string = toString(string).replace(reTrim, ''); return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10)); } @@ -12565,7 +12512,7 @@ return string; } if (guard || chars === undefined) { - return baseTrim(string); + return string.replace(reTrim, ''); } chars = (chars + ''); if (!chars) { @@ -12601,7 +12548,7 @@ return string; } if (guard || chars === undefined) { - return string.slice(0, trimmedEndIndex(string) + 1); + return string.replace(reTrimEnd, ''); } chars = (chars + ''); if (!chars) { @@ -12635,7 +12582,7 @@ return string; } if (guard || chars === undefined) { - return string.slice(trimmedStartIndex(string)); + return string.replace(reTrimStart, ''); } chars = (chars + ''); if (!chars) { diff --git a/test/test.js b/test/test.js index 190bf25db..23edc80ba 100644 --- a/test/test.js +++ b/test/test.js @@ -316,7 +316,19 @@ * Used to check for problems removing whitespace. For a whitespace reference, * see [V8's unit test](https://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/whitespaces.js). */ - var whitespace = ' \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000'; + var whitespace = lodashStable.filter([ + // Basic whitespace characters. + ' ', '\t', '\x0b', '\f', '\xa0', '\ufeff', + + // Line terminators. + '\n', '\r', '\u2028', '\u2029', + + // Unicode category "Zs" space separators. + '\u1680', '\u180e', '\u2000', '\u2001', '\u2002', '\u2003', '\u2004', '\u2005', + '\u2006', '\u2007', '\u2008', '\u2009', '\u200a', '\u202f', '\u205f', '\u3000' + ], + function(chr) { return /\s/.exec(chr); }) + .join(''); /** * Extracts the unwrapped value from its wrapper. @@ -21024,16 +21036,6 @@ assert.strictEqual(func(string), expected); }); - QUnit.test('`_.' + methodName + '` should not remove non-whitespace characters', function(assert) { - assert.expect(1); - - // Zero-width space (zws), next line character (nel), and non-character (bom) are not whitespace. - var problemChars = '\x85\u200b\ufffe', - string = problemChars + 'a b c' + problemChars; - - assert.strictEqual(func(string), string); - }); - QUnit.test('`_.' + methodName + '` should coerce `string` to a string', function(assert) { assert.expect(1);