JavaScript多个返回类型
我希望能够在JavaScript中调用函数并返回原语值,但也返回数据。例如,假设我想验证密码。有时我想知道它是否有效(满足最低要求),有时我想知道它有多强,有时我想知道它在文字上有多强(“弱,强”,等等) 所以基本上我希望这是有效的:JavaScript多个返回类型,javascript,json,Javascript,Json,我希望能够在JavaScript中调用函数并返回原语值,但也返回数据。例如,假设我想验证密码。有时我想知道它是否有效(满足最低要求),有时我想知道它有多强,有时我想知道它在文字上有多强(“弱,强”,等等) 所以基本上我希望这是有效的: if(validate.checkPassword(password))… 但这也是可行的: if (validate.checkPassword(password).strength === "strong") if (validate.checkPasswor
if(validate.checkPassword(password))…
但这也是可行的:
if (validate.checkPassword(password).strength === "strong")
if (validate.checkPassword(password).rating >= 6)
既然一个对象既可以是一个函数,也可以是一个包含数据的函数,那么一个JSON返回值是否可以既包含基元类型的基值,又包含其他数据成员
return { strength: 'abc', rating: -1 }
javascript中的Truthyness将使if语句工作,然后您可以检查JSON中所需的任何值。据我所知,您只能从函数中返回一个“thing”,但函数可以包含其他“thing” 我认为最好的结果是沿着以下路线返回一个对象:
{
valid:
strength:
rating:
}
然后你可以做你想做的事情,除了你需要做的默认类型之外:
if (validate.isValidPassword(password).valid)
编辑:作为每次返回对象的轻微对正。在我看来,我曾想象过你会一直想检查密码的有效与否。简单地返回false将为您提供密码是否通过的y/n,但不会为您提供确定“为什么”密码无效所需的信息。
如果您想显示一些“必须包含大写、小写并确保第一个字母是在星期一键入的”类型消息,那么在任何情况下都返回password“result”对象似乎是明智的。对我来说似乎更灵活。不,事情不能是多类型的。但是,您可以向该数据结构添加布尔值
if (validate.isValidPassword(passWord).isValid)...
但是你应该重新考虑一下你的命名法,因为那是一些令人困惑的东西
否则,null
是错误的,因此如果您只在有效的块内使用后一个语句,那么您应该没有问题。考虑:
function PasswordInfo(strength, rating)
{
this.strength = strength;
this.rating = rating;
}
function isValidPassword(password)
{
return new PasswordInfo('strong', 10);
}
function validate()
{
var info = isValidPassword('password');
if (info.strength === 'strong' && info.rating >== 6)
{
alert('good password);
}
else
{
alert('bad password);
}
}
本例中的函数
PasswordInfo
实际上是一个类/构造函数。首先,JSON只是JavaScript对象的符号,而不是对象本身的调用。在JavaScript(未序列化)中,它只是一个对象
话虽如此,您似乎希望从验证方法返回一个对象,然后该对象将公开您希望返回的各种信息。e、 g
function isValidPassword(pw){
var result = {
strength: 'weak',
rating: 0,
valid: false
};
// test and change result.strength, result.rating and result.valid
// based on the input
return result;
}
这是一个非此即彼的场景,因此您不能返回“true/false”并获取额外的元信息。请注意,在测试时,返回的任何对象都会导致true
结果,因此,考虑到上述情况:
var validPassword = validate.isValidPassword(null);
// always true, we have an object
if (validPassword){
}
// instead, you'd now need to check:
if (validPassword.valid){
}
(我也不考虑像isValidPassword
这样的名称意味着一个真/假结果,而不是一个对象结果,因此如果您正在创建一个公共库,如果您计划更改结果,我建议您重命名该函数)
但是,您可以使用多种方法来划分所需的详细级别,这使得简单的isValidPassword
可以按预期工作,但随后会添加诸如getPasswordStrength
、getPasswordRating
等功能:
function isValidPassword(pw){
// return true/false;
}
function getPasswordStrength(pw){
// return "weak","strong",etc.
}
function getPasswordRating(pw){
// return 1,2,etc.
}
这也使得隐含的结果在可读性方面更加清晰,同时仍然提供了获取所需信息的替代方案
if (!validator.isValidPassword(pw)){
error = pw + ' is unacceptable (' + validator.getPasswordStrength(pw) + ')';
}
对于无效密码,不能只返回
false
,一个具有有效密码所需参数的对象(因为所有对象在JavaScript布尔上下文中都被解释为true
),不要多次调用validate.checkPassword(password)
!