一段简单代码,用于验证JavaScript函数中的参数个数,类型等
?
使用方法:
在每个函数执行前调用验证函数,如果验证未通过,验证函数将返回true,否则返回false或者null
?
?
String.__typeName = "string";
Number.__typeName = "number";
Array.__typeName = "array";
Function.__typeName = "function";
Object.__typeName = "object";
ffap = {};
ffap.Utils = {
_isInstanceOfType: function(type, instance){
if (type === String) {
return (typeof instance === "string");
}
if (type === Number) {
return (typeof instance === "number");
}
if (type === Boolean) {
return (typeof instance === "boolean");
}
return instance instanceof type;
},
/**
* 验证函数参数
*
* @param {Object} params 待验证的参数
* @param {Object} expectedParams 期望的参数
* @param {Object} validateParameterCount 是否验证参数个数,默认为true
*/
validateParams: function(params, expectedParams, validateParameterCount){
/* 待验证的参数个数 */
var expectedLength = expectedParams.length, error = false;
validateParameterCount = validateParameterCount !== false;
error = ffap.Utils._validateParameterCount(params, expectedParams, validateParameterCount);
if (error) {
return true;
}
for (var i = 0, l = params.length; i < l; i++) {
var expectedParam = expectedParams[Math.min(i, expectedLength - 1)], paramName = expectedParam.name;
if (expectedParam.parameterArray) {
paramName += "[" + (i - expectedLength + 1) + "]";
}
else
if (!validateParameterCount && (i >= expectedLength)) {
break;
}
error = ffap.Utils._validateParameter(params[i], expectedParam, paramName);
if (error) {
return error;
}
}
return false;
},
_validateParameterCount: function(params, expectedParams, validateParameterCount){
var i, error, expectedLen = expectedParams.length, actualLen = params.length;
if (actualLen < expectedLen) {
var minParams = expectedLen;
for (i = 0; i < expectedLen; i++) {
var param = expectedParams[i];
if (param.optional || param.parameterArray) {
minParams--;
}
}
if (actualLen < minParams) {
error = true;
}
}
else
if (validateParameterCount && (actualLen > expectedLen)) {
error = true;
for (i = 0; i < expectedLen; i++) {
if (expectedParams[i].parameterArray) {
error = false;
break;
}
}
}
if (error) {
console.log("参数个数不正确");
return true;
}
return false;
},
_validateParameter: function(param, expectedParam, paramName){
var error, expectedType = expectedParam.type, expectedInteger = !!expectedParam.integer, expectedDomElement = !!expectedParam.domElement, mayBeNull = !!expectedParam.mayBeNull;
error = ffap.Utils._validateParameterType(param, expectedType, expectedInteger, expectedDomElement, mayBeNull, paramName);
if (error) {
return error;
}
var expectedElementType = expectedParam.elementType, elementMayBeNull = !!expectedParam.elementMayBeNull;
if (expectedType === Array && typeof(param) !== "undefined" && param !== null &&
(expectedElementType || !elementMayBeNull)) {
var expectedElementInteger = !!expectedParam.elementInteger, expectedElementDomElement = !!expectedParam.elementDomElement;
for (var i = 0; i < param.length; i++) {
var elem = param[i];
error = ffap.Utils._validateParameterType(elem, expectedElementType, expectedElementInteger, expectedElementDomElement, elementMayBeNull, paramName + "[" + i + "]");
if (error) {
return error;
}
}
}
return false;
},
_validateParameterType: function(param, expectedType, expectedInteger, expectedDomElement, mayBeNull, paramName){
var error, i;
if (typeof(param) === "undefined") {
if (mayBeNull) {
return null;
}
else {
console.log("参数" + paramName + "不能为undefined");
return true;
}
}
if (param === null) {
if (mayBeNull) {
return null;
}
else {
console.log("参数" + paramName + "不能为null");
return true;
}
}
if (expectedType && !ffap.Utils._isInstanceOfType(expectedType, param)) {
console.log("参数{" + paramName + ":" + param + "}的类型不匹配\n" + "应为:" + expectedType.__typeName + "\n实际为:" + typeof param);
return true;
}
if (expectedType === Number && expectedInteger) {
if ((param % 1) !== 0) {
console.log("参数{" + paramName + ":" + param + "}不是整数");
return true;
}
}
return false;
}
};
?
?
使用:
?
function func(a, b, c){
var error = ffap.Utils.validateParams(arguments, [{
name: "a",
type: Array,
mayBeNull: false,
optional: true,
elementType: Number,
elementMayBeNull: false
}, {
name: "b",
type: Boolean,
mayBeNull: false,
optional: false
}, {
name: "c",
type: Number,
mayBeNull: false,
optional: false
}]);
if (error) {
return;
}
执行原来其他函数体...
}
?
?
参数描述见下表:
?
属性 描述 type 期望的参数类型。可取值包括String、Number、 ? Boolean、Array、Function和Object mayBeNull 如果为true,参数可以为null optional 如果为true,参数可以忽略 integer 如果参数是一个Number,指定是否必须为整数 elementType 如果参数是一个Array,指定其元素的期望类型, 可取值与type属性相同 elementMayBeNull 如果参数是一个Array,指定是否可以包含null元素 elementInteger 如果参数是一个Array,指定其元素是否为整数
?
其中错误信息使用的是FireBug的console打印