From 9b5c97666aab2a0dbcb57891b045bb1365b8c651 Mon Sep 17 00:00:00 2001 From: jdalton Date: Sat, 11 Apr 2015 11:42:36 -0700 Subject: [PATCH] Ensure symbols work for `_.assign`, `_.defaults`, & `_.merge`. --- lodash.src.js | 36 ++++++++++++++++++++++++------------ test/test.js | 21 ++++++++++++++++++++- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/lodash.src.js b/lodash.src.js index ac4680e6c..c3a41fbb7 100644 --- a/lodash.src.js +++ b/lodash.src.js @@ -1777,8 +1777,10 @@ * @returns {Object} Returns `object`. */ function assignWith(object, source, customizer) { + var props = keys(source); + push.apply(props, getSymbols(source)); + var index = -1, - props = keys(source), length = props.length; while (++index < length) { @@ -2573,22 +2575,32 @@ return object; } var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source)); - (isSrcArr ? arrayEach : baseForOwn)(source, function(srcValue, key, source) { + if (!isSrcArr) { + var props = keys(source); + push.apply(props, getSymbols(source)); + } + arrayEach(props || source, function(srcValue, key) { + if (props) { + key = srcValue; + srcValue = source[key]; + } if (isObjectLike(srcValue)) { stackA || (stackA = []); stackB || (stackB = []); - return baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB); + baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB); } - var value = object[key], - result = customizer ? customizer(value, srcValue, key, object, source) : undefined, - isCommon = result === undefined; + else { + var value = object[key], + result = customizer ? customizer(value, srcValue, key, object, source) : undefined, + isCommon = result === undefined; - if (isCommon) { - result = srcValue; - } - if ((isSrcArr || result !== undefined) && - (isCommon || (result === result ? (result !== value) : (value === value)))) { - object[key] = result; + if (isCommon) { + result = srcValue; + } + if ((isSrcArr || result !== undefined) && + (isCommon || (result === result ? (result !== value) : (value === value)))) { + object[key] = result; + } } }); return object; diff --git a/test/test.js b/test/test.js index a74b09e35..3131e67cf 100644 --- a/test/test.js +++ b/test/test.js @@ -5767,6 +5767,25 @@ deepEqual(func({}, new Foo), { 'a': 1 }); }); + test('`_.' + methodName + '` should assign own symbols', 2, function() { + if (Symbol) { + var symbol1 = Symbol('a'), + symbol2 = Symbol('b'); + + var Foo = function() { + this[symbol1] = 1; + }; + Foo.prototype[symbol2] = 2; + + var actual = func({}, new Foo); + strictEqual(actual[symbol1], 1); + strictEqual(actual[symbol2], undefined); + } + else { + skipTest(2); + } + }); + test('`_.' + methodName + '` should assign problem JScript properties (test in IE < 9)', 1, function() { var object = { 'constructor': '0', @@ -5881,7 +5900,7 @@ if (isMerge) { expected.push([undefined, 2, 'b', sourceValue, sourceValue]); } - deepEqual(argsList, expected, 'non-primitive property values'); + deepEqual(argsList, expected, 'object property values'); }); test('`_.' + methodName + '` should support the `thisArg` argument', 1, function() {