2012-09-06 119 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) + ')'; 
}