diff --git a/lodash.src.js b/lodash.src.js index fb21e7f59..93d1656fa 100644 --- a/lodash.src.js +++ b/lodash.src.js @@ -9964,11 +9964,10 @@ * // => 5 */ function set(object, path, value) { - if (object == null) { - return object; - } if (isKey(path, object)) { - object[path] = value; + if (isObject(object)) { + object[path] = value; + } return object; } path = toPath(path); @@ -9978,12 +9977,14 @@ endIndex = length - 1, nested = object; - while (++index < length) { + while (nested != null && ++index < length) { var key = path[index]; - if (index == endIndex) { - nested[key] = value; - } else if (nested[key] == null) { - nested[key] = isIndex(path[index + 1]) ? [] : {}; + if (isObject(nested)) { + if (index == endIndex) { + nested[key] = value; + } else if (nested[key] == null) { + nested[key] = isIndex(path[index + 1]) ? [] : {}; + } } nested = nested[key]; } diff --git a/test/test.js b/test/test.js index 26bff70da..88826e47b 100644 --- a/test/test.js +++ b/test/test.js @@ -13261,7 +13261,7 @@ test('should follow `path` over non-plain objects', 2, function() { _.set(0, 'constructor.prototype.a', 'ok'); - strictEqual(1..a, 'ok'); + strictEqual(0..a, 'ok'); delete numberProto.a; var object = { 'a': '' }; @@ -13269,6 +13269,21 @@ strictEqual(stringProto.replace.b, 1); delete stringProto.replace.b; }); + + test('should not error on paths over primitive values in strict mode', 2, function() { + numberProto.a = 0; + + _.each(['a', 'a.a.a'], function(path) { + try { + _.set(0, path, 1); + strictEqual(0..a, 0); + } catch(e) { + ok(false, e.message); + } + }); + + delete numberProto.a; + }); }()); /*--------------------------------------------------------------------------*/