【问题标题】:Is there a concise syntax for declaring locally-scoped variable in JS `if` statement arguments?是否有在 JS `if` 语句参数中声明局部范围变量的简洁语法?
【发布时间】:2014-09-07 19:46:29
【问题描述】:

以下语法在 PHP 中运行良好:

if($data = check_database($conds)) var_dump($data);
else echo "Not found";

但是,在 Javascript 中,我找不到等效的速记:

/*THIS CREATES A GLOBAL VARIABLE:*/
if(data = check_database(conds)) console.log(data);
else console.log("Not found.");


/*THIS RESULTS IN A SYNTAX ERROR (unexpected token var):*/
if(var data = check_database(conds)) console.log(data);
else console.log("Not found.");

有没有办法让我在 if(和其他)语句中用 JavaScript 声明一个本地范围的 var。 注意:这对于 for 语句来说不是问题,它需要完整的语句作为参数。

最终,我想避免以下冗长的语法:

/*THIS HAS THE DESIRED EFFECT, BUT UNDESIRED (VERBOSE) SYNTAX*/
var data;
if(data = check_database(conds)) console.log(data);
else console.log("Not found.");

【问题讨论】:

  • 最终,在 if 语句中运行赋值存在维护风险。习惯以这种方式做事并因此遭受一堆错误,因为您现在不知道何时分配以及何时进行比较。我的意思是看起来有点相似,不是吗?在一条线上做一件事。冗长是好的。简洁而牺牲清晰度……真的吗?

标签: javascript


【解决方案1】:

这里的答案是,你不应该一开始就尝试编写这样的代码。

您可能对自己的聪明、简约的代码充满信心,但阅读它的人将不得不花费时间和精力来弄清楚您是否真的打算使用单个 =,或者在尝试输入 @987654322 时打错了字@。

只需编写意图明确的代码,并为 bug 留下最小的空间。多行几行不会对您造成伤害:

var data = check_database(conds);
if (data) {
    console.log(data);
} else {
    console.log("Not found.");
}


附录:如果你真的觉得必须使用 data 变量三次而不是两次很讨厌,那么另一种方法是编写一个辅助函数:
function handleData(data, success, failure) {
    if (data) {
        success(data);
        return data;
    }

    failure();
    return null;
}

然后你可以像这样使用它:

handleData(check_database(conds), function (data) {
    console.log(data);
}, function () {
    console.log("Not found.");
});

这比我原来的例子少了一行,但引入了很多不必要的开销和令人头疼的问题,以确保所有的大括号和括号都匹配。另外,它不太清楚,因为阅读它的人需要弄清楚/记住辅助函数的作用。

【讨论】:

  • 我了解 (+1)。这不是编写可维护代码的正确方法。但这并没有阻止我寻找解决方案的兴趣。有时它可能很有用 - 特别是在基于数据的应用程序中,这种相同类型的操作发生了几十次,很明显我的意图是尝试数据检索然后使用它,但在失败时提供错误或执行一些替代代码。我仍然想要一个正确的答案。
  • 我不确定我是否明白你的意思。如果你必须这样做几十次,会有什么不同?这只是意味着您可能会拥有数十个难以维护的代码实例。为数据检索设置一行,为if 设置一行有什么不好?您能否提供一个示例,说明我的示例不能替代您上面的示例?
  • 我很想挑战这样一种观念,即在 if 条件中声明一个变量在某种程度上不太可维护。对我来说似乎很主观。我在高度维护的代码中多次看到过这种情况。当然这只是一个轶事,但这就是这里提供的所有相反的东西。
  • @AnthonyTopper “可维护”和“高度维护”是两个不同的东西。我毫不怀疑有很多专业级软件在if 条件下使用作业。我敢肯定有很多,但这并不意味着这是一个好主意。甚至有一些编码标准(例如 MISRA 2004,参见规则 13.1)禁止在布尔控制表达式中使用赋值。
  • @JLRishe 如果你想学究气,唯一可辨别的方法是在没有数学离散定义的情况下判断某事,也就是“可维护”是看它是否真的被“维护”。即使这确实是主观的,但它可能是真正可维护性的最佳衡量标准。感谢您参考编码标准。
【解决方案2】:

这个具体的例子看起来你可以重写为

console.log( check_database(conds) || "Not found." );

但通常情况下,你会做:

if ( check_database(conds) ){
    console.log( data );
}
else {
    console.log( "Not found." );
}

var data = check_database(conds);
// maybe some other stuff
console.log( data || "Not found." );

甚至

var data = check_database(conds);
if ( data ){
    // some if true stuff
    console.log( data );
}
else {
    // some if false stuff
    console.log( "Not found." );
}

【讨论】:

  • 我知道 - 这是一个人为的例子 :)。 TRUE 分支中的实际代码可能要复杂得多,并且不会屈服于这种简写形式。
猜你喜欢
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多