From 5644a20eec1e3f073db9adc506d6236bba7567c1 Mon Sep 17 00:00:00 2001 From: xixilive Date: Thu, 20 Aug 2015 13:20:48 +0800 Subject: [PATCH] Add `_.isNil` function. --- lodash.js | 32 +++++++++++++++++++++++++++++- test/test.js | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/lodash.js b/lodash.js index 4b0277519..d1cb4afbc 100644 --- a/lodash.js +++ b/lodash.js @@ -854,7 +854,7 @@ * `has`, `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, * `isArray`, `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, * `isEqualWith`, `isError`, `isFinite` `isFunction`, `isMatch`, `isMatchWith`, - * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`, + * `isNative`, `isNaN`, `isNil`, `isNull`, `isNumber`, `isObject`, `isPlainObject`, * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`, * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`, * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`, @@ -8273,6 +8273,35 @@ return value === null; } + /** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null` or `undefined`, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(); + * // => true + * + * _.isNil(undefined); + * // => true + * + * _.isNil(NaN); + * // => false + * + * _.isNil(void 0); + * // => false + */ + function isNil(value) { + return value == null; + } + /** * Checks if `value` is classified as a `Number` primitive or object. * @@ -11515,6 +11544,7 @@ lodash.isMatchWith = isMatchWith; lodash.isNaN = isNaN; lodash.isNative = isNative; + lodash.isNil = isNil; lodash.isNull = isNull; lodash.isNumber = isNumber; lodash.isObject = isObject; diff --git a/test/test.js b/test/test.js index 3fb6a2ac9..5dcfe3c9c 100644 --- a/test/test.js +++ b/test/test.js @@ -7723,6 +7723,58 @@ /*--------------------------------------------------------------------------*/ + QUnit.module('lodash.isNil'); + + (function() { + var args = arguments; + + test('should return `true` for nulls', 1, function() { + strictEqual(_.isNil(null), true); + }); + + test('should return `true` for undefinitions', 2, function() { + strictEqual(_.isNil(), true); + strictEqual(_.isNil(undefined), true); + }); + + test('should return `false` for non-nils', 13, function() { + var expected = _.map(falsey, function(value) { + return undefined === value || null === value; + }); + + var actual = _.map(falsey, function(value) { + return _.isNil(value); + }); + + deepEqual(actual, expected); + + strictEqual(_.isNull(args), false); + strictEqual(_.isNull([1, 2, 3]), false); + strictEqual(_.isNull(true), false); + strictEqual(_.isNull(new Date), false); + strictEqual(_.isNull(new Error), false); + strictEqual(_.isNull(_), false); + strictEqual(_.isNull(slice), false); + strictEqual(_.isNull({ 'a': 1 }), false); + strictEqual(_.isNull(1), false); + strictEqual(_.isNull(NaN), false); + strictEqual(_.isNull(/x/), false); + strictEqual(_.isNull('a'), false); + }); + + test('should work with nulls from another realm', 2, function() { + if (_._object) { + strictEqual(_.isNil(_._null), true); + strictEqual(_.isNil(_._undefined), true); + } + else { + skipTest(); + } + }); + }(1, 2, 3)); + + /*--------------------------------------------------------------------------*/ + QUnit.module('lodash.isNumber'); (function() { @@ -17043,6 +17095,7 @@ 'isFinite', 'isFunction', 'isNaN', + 'isNil', 'isNull', 'isNumber', 'isObject', @@ -17269,7 +17322,7 @@ var acceptFalsey = _.difference(allMethods, rejectFalsey); - test('should accept falsey arguments', 223, function() { + test('should accept falsey arguments', 224, function() { var emptyArrays = _.map(falsey, _.constant([])); _.each(acceptFalsey, function(methodName) {