JavaScript多种返回类型

时间:2012-09-06 18:48:40

标签: javascript json

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

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

if (validate.checkPassword(password)) ...

但这也有效:

if (validate.checkPassword(password).strength === "strong")
if (validate.checkPassword(password).rating >= 6)

由于一个对象都可以是一个具有数据的函数,JSON返回值是否都具有基本类型基值和其他数据成员?

5 个答案:

答案 0 :(得分:2)

return { strength: 'abc', rating: -1 }

javascript中的Truthyness将使if语句有效,然后您可以检查JSON是否需要任何值。

答案 1 :(得分:2)

不,事情不能是多重打字的。但是,您可以向该数据结构添加布尔值

if (validate.isValidPassword(passWord).isValid)...

但你应该强烈重新考虑你的命名法,因为那里有一些混乱的东西。

否则,null是假的,所以如果你只在一个有效的块中使用后面的语句,那么你应该没有问题。

答案 2 :(得分:2)

首先,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,{{1}等功能等等:

getPasswordRating

这也使隐含的结果在可读性方面更加清晰,同时仍然提供了获取您正在寻找的信息的替代方案。

function isValidPassword(pw){
  // return true/false;
}
function getPasswordStrength(pw){
  // return "weak","strong",etc.
}
function getPasswordRating(pw){
  // return 1,2,etc.
}

答案 3 :(得分:1)

据我所知,你只能从你的函数中返回一个“东西”,但该函数可以包含其他“东西”。

我认为你最好的结果就是沿着这些方向返回一个对象:

{
    valid: 
    strength: 
    rating: 
}

然后你可以做你想要的事情,除了你需要做的默认类型:

if (validate.isValidPassword(password).valid)

编辑:作为每次返回对象的轻微理由。在我看来,我曾想过你总是想要检查密码有效与否的状态。简单地返回false会给出你是否通过的y / n,但是不会给你提供你需要的信息来确定密码无效的“原因”。 如果你想显示一些'你必须包括大写,小写并确保在星期一'类型消息上输入第一个字母,那么在每种情况下返回密码'result'对象似乎是明智的。对我来说似乎更灵活。

答案 4 :(得分:1)

考虑:

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实际上是一个类/构造函数。