3

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

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

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

而且这个工作:

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

既然一个对象既可以是函数也可以有数据,那么 JSON 返回值是否可以既有原始类型基值又有其他数据成员呢?

4

5 回答 5

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

javascript 中的真实性将使 if 语句起作用,然后您可以检查 JSON 以获取所需的任何值。

于 2012-09-06T18:51:38.187 回答
2

不,事物不能是多类型的。但是,您可以向该数据结构添加一个布尔值

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

但是你应该强烈地重新考虑你的命名法,因为那是一些令人困惑的东西。

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

于 2012-09-06T18:52:46.173 回答
2

首先,JSON 只是 JavaScript 对象的符号,而不是对象本身的名称。在 JavaScript(未序列化)中,它只是一个对象。

话虽如此,您似乎想从您的验证方法返回一个对象,然后该对象将公开您希望返回的各种信息。例如

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测试时产生结果,因此鉴于上述情况:

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) + ')';
}
于 2012-09-06T19:00:36.333 回答
1

据我所知,您只能从函数中返回一个“事物”,但该函数可以包含其他“事物”。

我认为您最好的结果是按照以下方式返回一个对象:

{
    valid: 
    strength: 
    rating: 
}

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

if (validate.isValidPassword(password).valid)

编辑:作为每次返回对象的轻微理由。在我的脑海中,我曾想象过您总是想检查密码为何有效或无效的状态。简单地返回 false 将为您提供是否通过的 y/n,但不会为您提供确定“为什么”密码无效所需的信息。如果您想显示一些“您必须包含大写、小写并确保在星期一输入第一个字母”类型的消息,那么在每种情况下都返回密码“结果”对象似乎是明智的。对我来说似乎更灵活。

于 2012-09-06T18:52:29.010 回答
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实际上是一个类/构造函数。

于 2012-09-06T18:53:10.210 回答