3

JavaScript で関数を呼び出して、プリミティブ値だけでなくデータも返せるようにしたいと考えています。たとえば、パスワードを検証したいとしましょう。有効かどうか (最小要件を満たしているか) を知りたい場合もあれば、どのくらい強いのかを知りたい場合もあれば、単語 (「弱い、強い」など) でどのくらい強いかを知りたい場合もあります。 )。

だから基本的に私はこれが有効であることを望みます:

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

しかし、これも機能します:

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

オブジェクトは関数とデータを持つことができるので、JSON の戻り値はプリミティブ型のベース値と他のデータ メンバーの両方を持つことができますか?

4

5 に答える 5

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/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意図したとおりに簡単に機能しますがgetPasswordStrengthgetPasswordRating、 などの機能を追加できます。

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 に答える
2

いいえ、物事を複数型にすることはできません。ただし、そのデータ構造にブール値を追加できます

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

しかし、それはいくつかの紛らわしいものであるため、命名法を強く再考する必要があります.

それ以外の場合nullは false であるため、有効なブロック内で後者のステートメントのみを使用する場合、問題はないはずです。

于 2012-09-06T18:52:46.173 に答える
2
return { strength: 'abc', rating: -1 }

JavaScript の真実性により、if ステートメントが機能し、JSON で必要な値を調べることができます。

于 2012-09-06T18:51:38.187 に答える
1

私の知る限り、関数から返せるのは 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 に答える