2012-09-06 118 views
3

我希望能够在JavaScript中调用一个函数,并返回一个原始值,但也返回数据。例如,假设我想验证密码。有时候我想知道它是否有效(符合最低要求),有时我想知道它有多强,有时候我想知道它有多强(“弱,强”等)。 )。JavaScript多种返回类型

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

​​

而且这个工作:

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

由于对象既可以是一个函数有数据,可以一个JSON回报值都有一个原始类型基值和其他数据成员?

+2

你不能只返回'FALSE'非有效的密码,一个物体与有效密码所需的参数(因为所有的对象都被解释为'在JavaScript中布尔上下文TRUE') – Saebekassebil

+0

不要多次调用'validate.checkPassword(password)'! –

回答

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

在javascript中的真实性将使if语句的工作,然后你可以检查JSON的任何需要的值。

1

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

我觉得你最好的结果将是返回一个对象沿着这些线路:

{ 
    valid: 
    strength: 
    rating: 
} 

那么你可以做你希望以上内容,与在那里你需要默认的类型除外做:

if (validate.isValidPassword(password).valid) 

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

2

不,事物不能被多次输入。但是,你可以一个布尔值添加到数据结构

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

,但是你应该认真考虑您的命名,因为这是一些容易混淆的东西在那里。

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

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

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) + ')'; 
}