服务端阅读 02月18日 22:04
Lodash中有哪些类型检查方法?请举例说明它们的用法
Lodash提供了丰富的类型检查方法,以下是关于Lodash类型检查的详细解答:Lodash类型检查方法概述Lodash提供了许多类型检查方法,用于判断值的类型。这些方法比原生的typeof和instanceof更准确、更可靠。1. 基本类型检查_.isBoolean(value)检查值是否是布尔类型。_.isBoolean(false);// => true_.isBoolean(null);// => false// 实际应用:验证布尔参数function processFlag(flag) { if (!_.isBoolean(flag)) { throw new Error('Flag must be a boolean'); } return flag ? 'enabled' : 'disabled';}_.isNumber(value)检查值是否是数字。_.isNumber(3);// => true_.isNumber(Number.MIN_VALUE);// => true_.isNumber(Infinity);// => true_.isNumber('3');// => false// 实际应用:验证数字输入function calculateDiscount(price, discount) { if (!_.isNumber(price) || !_.isNumber(discount)) { throw new Error('Price and discount must be numbers'); } return price * (1 - discount);}_.isString(value)检查值是否是字符串。_.isString('abc');// => true_.isString(1);// => false// 实际应用:验证字符串输入function sanitizeInput(input) { if (!_.isString(input)) { return String(input); } return _.trim(input);}_.isFunction(value)检查值是否是函数。_.isFunction(_);// => true_.isFunction(/abc/);// => false// 实际应用:验证回调函数function executeCallback(callback) { if (!_.isFunction(callback)) { console.warn('Callback is not a function'); return; } callback();}2. 对象类型检查_.isObject(value)检查值是否是对象类型(包括数组、函数、对象等)。_.isObject({});// => true_.isObject([1, 2, 3]);// => true_.isObject(_.noop);// => true_.isObject(null);// => false// 实际应用:检查是否为对象类型function processValue(value) { if (_.isObject(value)) { return _.cloneDeep(value); } return value;}_.isPlainObject(value)检查值是否是普通对象(通过Object构造函数创建的对象)。function Foo() { this.a = 1;}_.isPlainObject(new Foo());// => false_.isPlainObject([1, 2, 3]);// => false_.isPlainObject({ 'x': 0, 'y': 0 });// => true_.isPlainObject(Object.create(null));// => true// 实际应用:验证配置对象function validateConfig(config) { if (!_.isPlainObject(config)) { throw new Error('Config must be a plain object'); } return config;}_.isObjectLike(value)检查值是否是类对象(非null且typeof为'object')。_.isObjectLike({});// => true_.isObjectLike([1, 2, 3]);// => true_.isObjectLike(_.noop);// => false_.isObjectLike(null);// => false3. 数组类型检查_.isArray(value)检查值是否是数组。_.isArray([1, 2, 3]);// => true_.isArray(document.body.children);// => false_.isArray('abc');// => false_.isArray(_.noop);// => false// 实际应用:验证数组输入function processItems(items) { if (!_.isArray(items)) { items = [items]; } return _.map(items, item => transform(item));}_.isArrayLike(value)检查值是否是类数组(有length属性且为非负整数)。_.isArrayLike([1, 2, 3]);// => true_.isArrayLike(document.body.children);// => true_.isArrayLike('abc');// => true_.isArrayLike(_.noop);// => false4. 空值检查_.isEmpty(value)检查值是否为空。_.isEmpty(null);// => true_.isEmpty(true);// => true_.isEmpty(1);// => true_.isEmpty([1, 2, 3]);// => false_.isEmpty({ 'a': 1 });// => false_.isEmpty('');// => true_.isEmpty(' ');// => false// 实际应用:验证必填字段function validateRequired(value, fieldName) { if (_.isEmpty(value)) { throw new Error(`${fieldName} is required`); } return value;}_.isNil(value)检查值是否为null或undefined。_.isNil(null);// => true_.isNil(void 0);// => true_.isNil(NaN);// => false// 实际应用:安全访问属性function safeGet(obj, path) { const value = _.get(obj, path); return _.isNil(value) ? null : value;}5. 数字类型检查_.isInteger(value)检查值是否是整数。_.isInteger(3);// => true_.isInteger(Number.MIN_VALUE);// => false_.isInteger(Infinity);// => false_.isInteger('3');// => false// 实际应用:验证整数输入function validateCount(count) { if (!_.isInteger(count) || count < 0) { throw new Error('Count must be a positive integer'); } return count;}_.isFinite(value)检查值是否是有限数字。_.isFinite(3);// => true_.isFinite(Number.MIN_VALUE);// => true_.isFinite(Infinity);// => false_.isFinite('3');// => false// 实际应用:验证有限数字function calculate(value) { if (!_.isFinite(value)) { throw new Error('Value must be a finite number'); } return Math.sqrt(value);}_.isNaN(value)检查值是否是NaN(比原生isNaN更准确)。_.isNaN(NaN);// => true_.isNaN(new Number(NaN));// => trueisNaN(undefined);// => true_.isNaN(undefined);// => false// 实际应用:验证数字计算结果function divide(a, b) { const result = a / b; if (_.isNaN(result)) { throw new Error('Invalid calculation result'); } return result;}6. 日期和正则表达式检查_.isDate(value)检查值是否是日期对象。_.isDate(new Date());// => true_.isDate('Mon April 23 2012');// => false// 实际应用:验证日期输入function formatDate(date) { if (!_.isDate(date)) { date = new Date(date); } return date.toISOString();}_.isRegExp(value)检查值是否是正则表达式。_.isRegExp(/abc/);// => true_.isRegExp('/abc/');// => false// 实际应用:验证正则表达式function compilePattern(pattern) { if (_.isRegExp(pattern)) { return pattern; } return new RegExp(pattern);}7. 元素检查_.isElement(value)检查值是否是DOM元素。_.isElement(document.body);// => true_.isElement('<body>');// => false// 实际应用:验证DOM元素function attachListener(element, event, handler) { if (!_.isElement(element)) { throw new Error('Element must be a DOM element'); } element.addEventListener(event, handler);}_.isArguments(value)检查值是否是arguments对象。_.isArguments(function() { return arguments; }());// => true_.isArguments([1, 2, 3]);// => false8. 其他类型检查_.isError(value)检查值是否是Error对象。_.isError(new Error());// => true_.isError(Error);// => false// 实际应用:错误处理function handleError(error) { if (_.isError(error)) { console.error(error.message); return; } console.error('Unknown error:', error);}_.isSymbol(value)检查值是否是Symbol。_.isSymbol(Symbol.iterator);// => true_.isSymbol('abc');// => false// 实际应用:检查Symbol属性function hasSymbolProperty(obj, sym) { return _.isSymbol(sym) && sym in obj;}_.isTypedArray(value)检查值是否是类型化数组。_.isTypedArray(new Uint8Array());// => true_.isTypedArray([]);// => false// 实际应用:处理二进制数据function processData(data) { if (_.isTypedArray(data)) { return processBinaryData(data); } return processRegularData(data);}_.isWeakMap(value)检查值是否是WeakMap。_.isWeakMap(new WeakMap());// => true_.isWeakMap(new Map());// => false_.isWeakSet(value)检查值是否是WeakSet。_.isWeakSet(new WeakSet());// => true_.isWeakSet(new Set());// => false_.isMap(value)检查值是否是Map。_.isMap(new Map());// => true_.isMap(new WeakMap());// => false_.isSet(value)检查值是否是Set。_.isSet(new Set());// => true_.isSet(new WeakSet());// => false实际应用示例类型验证器class TypeValidator { static validate(value, type) { const validators = { 'string': _.isString, 'number': _.isNumber, 'boolean': _.isBoolean, 'array': _.isArray, 'object': _.isPlainObject, 'function': _.isFunction, 'date': _.isDate, 'regexp': _.isRegExp }; const validator = validators[type]; if (!validator) { throw new Error(`Unknown type: ${type}`); } return validator(value); } static validateSchema(data, schema) { const errors = []; _.forOwn(schema, (type, field) => { const value = data[field]; if (!_.isNil(value) && !this.validate(value, type)) { errors.push(`${field} must be ${type}`); } }); return { valid: errors.length === 0, errors }; }}const schema = { name: 'string', age: 'number', active: 'boolean', tags: 'array'};const data = { name: 'John', age: 30, active: true, tags: ['developer', 'javascript']};const result = TypeValidator.validateSchema(data, schema);// => { valid: true, errors: [] }安全的数据访问class SafeAccessor { static get(obj, path, defaultValue = null) { const value = _.get(obj, path); return _.isNil(value) ? defaultValue : value; } static getNumber(obj, path, defaultValue = 0) { const value = _.get(obj, path); return _.isNumber(value) ? value : defaultValue; } static getString(obj, path, defaultValue = '') { const value = _.get(obj, path); return _.isString(value) ? value : defaultValue; } static getArray(obj, path, defaultValue = []) { const value = _.get(obj, path); return _.isArray(value) ? value : defaultValue; } static getObject(obj, path, defaultValue = {}) { const value = _.get(obj, path); return _.isPlainObject(value) ? value : defaultValue; }}const data = { user: { name: 'John', age: 30, tags: ['developer'] }};console.log(SafeAccessor.getString(data, 'user.name'));// => 'John'console.log(SafeAccessor.getNumber(data, 'user.age'));// => 30console.log(SafeAccessor.getArray(data, 'user.tags'));// => ['developer']console.log(SafeAccessor.getObject(data, 'user.profile'));// => {}类型转换器class TypeConverter { static toString(value) { if (_.isString(value)) return value; if (_.isNil(value)) return ''; if (_.isDate(value)) return value.toISOString(); return String(value); } static toNumber(value) { if (_.isNumber(value)) return value; if (_.isString(value)) { const num = Number(value); return _.isNaN(num) ? 0 : num; } if (_.isBoolean(value)) return value ? 1 : 0; return 0; } static toArray(value) { if (_.isArray(value)) return value; if (_.isNil(value)) return []; if (_.isString(value)) return _.split(value, ''); return [value]; } static toObject(value) { if (_.isPlainObject(value)) return value; if (_.isArray(value)) return _.fromPairs(value)); return {}; }}console.log(TypeConverter.toString(123));// => '123'console.log(TypeConverter.toNumber('123'));// => 123console.log(TypeConverter.toArray('abc'));// => ['a', 'b', 'c']console.log(TypeConverter.toObject([['a', 1], ['b', 2]]));// => { a: 1, b: 2 }总结Lodash提供了丰富的类型检查方法,包括:基本类型检查:_.isBoolean、_.isNumber、_.isString、_.isFunction对象类型检查:_.isObject、_.isPlainObject、_.isObjectLike数组类型检查:_.isArray、_.isArrayLike空值检查:_.isEmpty、_.isNil数字类型检查:_.isInteger、_.isFinite、_.isNaN日期和正则表达式检查:_.isDate、_.isRegExp元素检查:_.isElement、_.isArguments其他类型检查:_.isError、_.isSymbol、_.isTypedArray等这些类型检查方法比原生的typeof和instanceof更准确、更可靠。在实际开发中,建议使用这些方法来进行类型验证,以提高代码的健壮性和可维护性。