diff --git a/fp/_baseConvert.js b/fp/_baseConvert.js index 7af27655b..fcc28f26b 100644 --- a/fp/_baseConvert.js +++ b/fp/_baseConvert.js @@ -171,7 +171,9 @@ function baseConvert(util, name, func, options) { 'curry': util.curry, 'forEach': util.forEach, 'isArray': util.isArray, + 'isError': util.isError, 'isFunction': util.isFunction, + 'isWeakMap': util.isWeakMap, 'iteratee': util.iteratee, 'keys': util.keys, 'rearg': util.rearg, @@ -185,7 +187,9 @@ function baseConvert(util, name, func, options) { curry = helpers.curry, each = helpers.forEach, isArray = helpers.isArray, + isError = helpers.isError, isFunction = helpers.isFunction, + isWeakMap = helpers.isWeakMap, keys = helpers.keys, rearg = helpers.rearg, toInteger = helpers.toInteger, @@ -355,8 +359,9 @@ function baseConvert(util, name, func, options) { var key = path[index], value = nested[key]; - if (value != null) { - nested[path[index]] = clone(index == lastIndex ? value : Object(value)); + if (value != null && + !(isFunction(value) || isError(value) || isWeakMap(value))) { + nested[key] = clone(index == lastIndex ? value : Object(value)); } nested = nested[key]; } diff --git a/lib/fp/template/modules/_util.jst b/lib/fp/template/modules/_util.jst index 708446302..1dbf36f5d 100644 --- a/lib/fp/template/modules/_util.jst +++ b/lib/fp/template/modules/_util.jst @@ -5,7 +5,9 @@ module.exports = { 'curry': require('../curry'), 'forEach': require('../_arrayEach'), 'isArray': require('../isArray'), + 'isError': require('../isError'), 'isFunction': require('../isFunction'), + 'isWeakMap': require('../isWeakMap'), 'iteratee': require('../iteratee'), 'keys': require('../_baseKeys'), 'rearg': require('../rearg'), diff --git a/test/test-fp.js b/test/test-fp.js index 46a4c87b1..dbc035258 100644 --- a/test/test-fp.js +++ b/test/test-fp.js @@ -2138,6 +2138,16 @@ assert.strictEqual(typeof actual.a.b, 'number'); }); + QUnit.test('should not convert uncloneables to objects', function(assert) { + assert.expect(2); + + var object = { 'a': { 'b': _.constant(true) } }, + actual = fp.update('a.b')(_.identity)(object); + + assert.strictEqual(typeof object.a.b, 'function') + assert.strictEqual(object.a.b, actual.a.b); + }); + QUnit.test('should not mutate values', function(assert) { assert.expect(2);