mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-07 10:07:48 +00:00
Ensure resolver provided to _.memoize is a function if it's truthy.
This commit is contained in:
2
dist/lodash.underscore.js
vendored
2
dist/lodash.underscore.js
vendored
@@ -3460,7 +3460,7 @@
|
|||||||
* // => { 'name': 'penelope', 'age': 1 }
|
* // => { 'name': 'penelope', 'age': 1 }
|
||||||
*/
|
*/
|
||||||
function memoize(func, resolver) {
|
function memoize(func, resolver) {
|
||||||
if (!isFunction(func)) {
|
if (!isFunction(func) || (resolver && !isFunction(resolver))) {
|
||||||
throw new TypeError;
|
throw new TypeError;
|
||||||
}
|
}
|
||||||
var cache = {};
|
var cache = {};
|
||||||
|
|||||||
@@ -5296,7 +5296,7 @@
|
|||||||
* // => { 'name': 'penelope', 'age': 1 }
|
* // => { 'name': 'penelope', 'age': 1 }
|
||||||
*/
|
*/
|
||||||
function memoize(func, resolver) {
|
function memoize(func, resolver) {
|
||||||
if (!isFunction(func)) {
|
if (!isFunction(func) || (resolver && !isFunction(resolver))) {
|
||||||
throw new TypeError;
|
throw new TypeError;
|
||||||
}
|
}
|
||||||
var memoized = function() {
|
var memoized = function() {
|
||||||
|
|||||||
35
test/test.js
35
test/test.js
@@ -856,10 +856,6 @@
|
|||||||
deepEqual(bound(['b'], 'c'), [object, 'a', ['b'], 'c']);
|
deepEqual(bound(['b'], 'c'), [object, 'a', ['b'], 'c']);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should throw a TypeError if `func` is not a function', 1, function() {
|
|
||||||
raises(function() { _.bind(); }, TypeError);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('should return a wrapped value when chaining', 2, function() {
|
test('should return a wrapped value when chaining', 2, function() {
|
||||||
if (!isNpm) {
|
if (!isNpm) {
|
||||||
var object = {},
|
var object = {},
|
||||||
@@ -3092,7 +3088,6 @@
|
|||||||
function callback(num, index) {
|
function callback(num, index) {
|
||||||
actual = this[index];
|
actual = this[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
func([1], callback, [2]);
|
func([1], callback, [2]);
|
||||||
strictEqual(actual, 2);
|
strictEqual(actual, 2);
|
||||||
|
|
||||||
@@ -3405,7 +3400,7 @@
|
|||||||
deepEqual(_.without.apply(_, [largeArray].concat(largeArray)), []);
|
deepEqual(_.without.apply(_, [largeArray].concat(largeArray)), []);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('lodash.memoize should memoize values resolved to the `__proto__` key', 1, function() {
|
test('lodash.memoize should support values that resolve to the `__proto__` key', 1, function() {
|
||||||
var count = 0,
|
var count = 0,
|
||||||
memoized = _.memoize(function() { return ++count; });
|
memoized = _.memoize(function() { return ++count; });
|
||||||
|
|
||||||
@@ -5653,7 +5648,6 @@
|
|||||||
function callback(num, index) {
|
function callback(num, index) {
|
||||||
return this[index] + num;
|
return this[index] + num;
|
||||||
}
|
}
|
||||||
|
|
||||||
var actual = _.map([1], callback, [2]);
|
var actual = _.map([1], callback, [2]);
|
||||||
deepEqual(actual, [3]);
|
deepEqual(actual, [3]);
|
||||||
|
|
||||||
@@ -5748,7 +5742,6 @@
|
|||||||
function callback(num, key) {
|
function callback(num, key) {
|
||||||
return this[key] + num;
|
return this[key] + num;
|
||||||
}
|
}
|
||||||
|
|
||||||
var actual = _.mapValues({ 'a': 1 }, callback, { 'a': 2 });
|
var actual = _.mapValues({ 'a': 1 }, callback, { 'a': 2 });
|
||||||
deepEqual(actual, { 'a': 3 });
|
deepEqual(actual, { 'a': 3 });
|
||||||
|
|
||||||
@@ -5920,6 +5913,22 @@
|
|||||||
strictEqual(object.memoized(2), 7);
|
strictEqual(object.memoized(2), 7);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should throw a TypeError if `resolve` is truthy and not a function', function() {
|
||||||
|
raises(function() { _.memoize(_.noop, {}); }, TypeError);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should not throw a TypeError if `resolve` is falsey', function() {
|
||||||
|
var expected = _.map(falsey, _.constant(true));
|
||||||
|
|
||||||
|
var actual = _.map(falsey, function(value, index) {
|
||||||
|
try {
|
||||||
|
return _.isFunction(index ? _.memoize(_.noop, value) : _.memoize(_.noop));
|
||||||
|
} catch(e) { }
|
||||||
|
});
|
||||||
|
|
||||||
|
deepEqual(actual, expected);
|
||||||
|
});
|
||||||
|
|
||||||
test('should check cache for own properties', 1, function() {
|
test('should check cache for own properties', 1, function() {
|
||||||
var actual = [],
|
var actual = [],
|
||||||
memoized = _.memoize(_.identity);
|
memoized = _.memoize(_.identity);
|
||||||
@@ -6443,14 +6452,14 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('should not throw more than once', 2, function() {
|
test('should not throw more than once', 2, function() {
|
||||||
var pass = true;
|
|
||||||
|
|
||||||
var once = _.once(function() {
|
var once = _.once(function() {
|
||||||
throw new Error;
|
throw new Error;
|
||||||
});
|
});
|
||||||
|
|
||||||
raises(function() { once(); }, Error);
|
raises(function() { once(); }, Error);
|
||||||
|
|
||||||
|
var pass = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
once();
|
once();
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
@@ -10149,9 +10158,7 @@
|
|||||||
QUnit.module('lodash methods');
|
QUnit.module('lodash methods');
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
var allMethods = _.reject(_.functions(_), function(methodName) {
|
var allMethods = _.reject(_.functions(_), _.bind(RegExp.prototype.test, /^_/));
|
||||||
return /^_/.test(methodName);
|
|
||||||
});
|
|
||||||
|
|
||||||
var returnArrays = [
|
var returnArrays = [
|
||||||
'at',
|
'at',
|
||||||
@@ -10277,7 +10284,7 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should reject falsey arguments', 15, function() {
|
test('should throw a TypeError for falsey arguments', 15, function() {
|
||||||
_.each(rejectFalsey, function(methodName) {
|
_.each(rejectFalsey, function(methodName) {
|
||||||
var expected = _.map(falsey, _.constant(true)),
|
var expected = _.map(falsey, _.constant(true)),
|
||||||
func = _[methodName];
|
func = _[methodName];
|
||||||
|
|||||||
Reference in New Issue
Block a user