如何最好地在JavaScript中实现params?

Nic*_*ner 35 javascript out-parameters

我在jQuery中使用Javascript.我想实现params.在C#中,它看起来像这样:

/*
 * odp      the object to test
 * error    a string that will be filled with the error message if odp is illegal. Undefined otherwise.
 *
 * Returns  true if odp is legal.
 */
bool isLegal(odp, out error);
Run Code Online (Sandbox Code Playgroud)

在JS中做这样的事情的最佳方法是什么?对象?

function isLegal(odp, errorObj)
{
    // ...
    errorObj.val = "ODP failed test foo";
    return false;
}
Run Code Online (Sandbox Code Playgroud)

Firebug告诉我上述方法可行,但是有更好的方法吗?

Poi*_*nty 41

@Felix Kling提到的回调方法可能是最好的想法,但我也发现有时候很容易利用Javascript对象的文字语法,只是让你的函数在错误时返回一个对象:

function mightFail(param) {
  // ...
  return didThisFail ? { error: true, msg: "Did not work" } : realResult;
}
Run Code Online (Sandbox Code Playgroud)

那么当你调用这个函数时:

var result = mightFail("something");
if (result.error) alert("It failed: " + result.msg);
Run Code Online (Sandbox Code Playgroud)

不花哨,几乎没有防弹,但对于一些简单的情况肯定是可以的.

  • 好吧,回答者没有设计语言。在语言的范围内,这可能是一个很好的答案。如果 JavaScript 很糟糕,那不是回答者的错。 (3认同)
  • 进入此页面是因为我对Javascript可能会或可能不会处理参数感兴趣,我对可接受的答案感到失望。在对非常过程化的逻辑进行编程时,具有确定的返回类型以及具有确定类型的一对多参数的能力是一种非常强大的功能。不幸的是,以我微薄的声誉,我无法拒绝投票。 (2认同)

cas*_*nca 16

是的,正如您自己提到的,对象是在JavaScript中通过引用传递数据的最佳和唯一方式.我会保持你的isLegal功能,简单地称之为:

var error = {};
isLegal("something", error);
alert(error.val);
Run Code Online (Sandbox Code Playgroud)


Fel*_*ing 15

我认为这是唯一的方法(但我不是一个铁杆JavaScript程序员;)).

您还可以考虑使用回调函数:

function onError(data) {
    // do stuff
}


function isLegal(odp, cb) {
    //...
    if(error) cb(error);
    return false;
}

isLegal(value, onError);
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 7

到目前为止,我看到的答案没有在 JavaScript 中实现参数,因为它们在 C#(out关键字)中使用。它们只是一种在发生错误时返回对象的解决方法。

但是如果你真的需要参数,你会怎么做?

因为 Javascript 不直接支持它,所以你需要构建一些接近 C# 的输出参数的东西。看看这个方法,我在 JavaScript 中模拟 C#s DateTime.TryParse 函数。out 参数是结果,因为 JavaScript 没有提供 out 关键字,所以我.value在函数内部使用 将值传递到函数外部(受MDN 建议的启发):

// create a function similar to C#'s DateTime.TryParse
var DateTime = [];
DateTime.TryParse = function(str, result) {
  result.value = new Date(str); // out value
  return (result.value != "Invalid Date");
};

// now invoke it
var result = [];
if (DateTime.TryParse("05.01.2018", result)) {
  alert(result.value);
} else {
  alert("no date");
};
Run Code Online (Sandbox Code Playgroud)

运行代码片段,您将看到它的工作原理:它将str参数解析为 Date 并在result参数中返回它。请注意,调用该函数之前result需要将其初始化为空数组[](根据您的需要,它也可以是一个对象)。这是必需的,因为在函数内部您“注入”了该属性。{}.value


现在,您可以使用上面的模式编写一个函数作为您问题中的函数(这也向您展示了如何模拟C# 中已知的新丢弃参数out _:在 JavaScript 中,我们传递[]如下所示):

// create a function similar to C#'s DateTime.TryParse
var DateTime = [];
DateTime.TryParse = function(str, result) {
  result.value = new Date(str); // out value
  return (result.value != "Invalid Date");
};

// returns false, if odb is no date, otherwise true
function isLegal(odp, errorObj) {
  if (DateTime.TryParse(odp, [])) { // discard result here by passing []
    // all OK: leave errorObj.value undefined and return true
    return true;
  } else {
    errorObj.value = "ODP failed test foo"; // return error
    return false;
  }
}

// now test the function
var odp = "xxx01.12.2018xx"; // invalid date
var errorObj = [];
if (!isLegal(odp, errorObj)) alert(errorObj.value); else alert("OK!");
Run Code Online (Sandbox Code Playgroud)

此示例的作用是使用result参数传递错误消息,如下所示:

errorObj.value = "ODP 测试失败 foo"; // 返回错误

如果您运行该示例,它将在弹出对话框中显示此消息。

注意:除了使用上面显示的丢弃参数,在 JavaScript 中你还可以使用检查 for undefined,即在函数内部检查

if (result === undefined) { 
   // do the check without passing back a value, i.e. just return true or false 
};
Run Code Online (Sandbox Code Playgroud)

result如果不需要,则可以完全省略作为参数,因此您可以像这样调用它

if (DateTime.TryParse(odp)) { 
    // ... same code as in the snippet above ...
};
Run Code Online (Sandbox Code Playgroud)

  • `var DateTime = {};` 和 `var errorObj = {};` (2认同)