JavaScript多个返回类型

JavaScript多个返回类型,javascript,json,Javascript,Json,我希望能够在JavaScript中调用函数并返回原语值,但也返回数据。例如,假设我想验证密码。有时我想知道它是否有效(满足最低要求),有时我想知道它有多强,有时我想知道它在文字上有多强(“弱,强”,等等) 所以基本上我希望这是有效的: if(validate.checkPassword(password))… 但这也是可行的: if (validate.checkPassword(password).strength === "strong") if (validate.checkPasswor

我希望能够在JavaScript中调用函数并返回原语值,但也返回数据。例如,假设我想验证密码。有时我想知道它是否有效(满足最低要求),有时我想知道它有多强,有时我想知道它在文字上有多强(“弱,强”,等等)

所以基本上我希望这是有效的:

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)