从函数返回第二个值的最便捷方法是什么

时间:2013-02-01 09:06:57

标签: javascript conventions

我不时使用JavaScript,尝试使用我习惯使用其他语言的模式。当函数结果是关于操作成功的时候,其中一个参数是对实际返回值的引用。

知道JavaScript中没有通过引用传递,唯一的方法是使用对象(包括数组)。像

这样的东西
function getSomething(res)
{
  if (....)
  {
    res["value"] = 123;
    return true;
  } else
    return false;
}

但这会带来一些不便。其中之一是当我实际使用这个功能时,我不应该忘记约定,所以我自然的处理方法是

  var value = {};  
  if (getSomething(value))
  {
    if (value == 123)
    {
    }
  }  

当我应该记住的正确方法是

...
if (value["value"] == 123)
...

此外,如果我忘记使用{}初始化值,那么我会收到另一个错误。

所以,对于那些混合语言的人来说,这可能是一个问题。您认为这种返回模式方便的约定是什么?

更新: 作为将出现在C程序中的实际代码片段的示例

if (getSomethingA(&res1) && getSomethingB(&res2) && getSomethingC(&res3)) {
     ...   
     v = res1*res2*res3;
     ...
} 

我无法弄清楚如何在JavaScript中实现类似这样的东西,而不是“不那么容易记住约定”或太多行。

2 个答案:

答案 0 :(得分:2)

为什么不创建响应对象并在其中包含状态和实际响应值的一些字段。每次返回该对象,而不是在false上返回false,在true上返回数组

成功

 response=new Object();
 response.status=true;
 response.value="Response string";
 return response;

失败

response=new Object();
 response.status=false;
 response.value="Response string";
 return response;

您还可以使用其他语法来避免extra line

response={status:true,value:"Response string"};

答案 1 :(得分:1)

如果您的首要任务是编写与C示例最相似的代码,则可以将getSomething()函数作为对象传递,在这种情况下,您可以通过引用很好地操作它,同时返回一个单独的值(还可以查看this fiddle):

var someA = {}, someB={}, someC={};

if(getSomethingA(someA) && getSomethingB(someB) && getSomethingC(someC)) {
    var values = [someA.value, someB.value, someC.value];
    alert('Success...Values are:\n' + values.join('\n'));
} else {
    alert('Failure!');
}

function getSomethingA(refObj) {
    if(...) {
        refObj.value = 123;
        return true;
    } else {
        return false;
    }
}

function getSomethingB(refObj) {
    if(...) {
        refObj.value = 456;
        return true;
    } else {
        return false;
    }
}

function getSomethingC(refObj) {
    if(...) {
        refObj.value = 789;
        return true;
    } else {
        return false;
    }
}