【问题标题】:Javascript - Omitting Return False [closed]Javascript - 省略返回错误 [关闭]
【发布时间】:2013-09-04 06:30:04
【问题描述】:

我最近意识到,当我使用函数循环遍历数组并返回匹配项时,实际上我不需要在最后返回 false/null。

例如,如果我有:

*编辑示例。原始示例来自我试图简化但忘记更改名称/上下文的函数。对困惑感到抱歉。这是一个适合我问题标题的更好示例:

var hasKey = hasKeyMatch(key);
function hasKeyMatch(key) {
    for (var i = 0; i < array.length) {
        if (array[i].key === key) {
            return true;
        }
    }
};

其实我不需要return false,好像没有key的return,hasKey就会是undefined。所以我仍然可以使用 hasKey 作为布尔值。

但这算是好的风格吗?我意识到在 Java 这样的语言中,有一个“备份”返回是必要的,所以有些人把这个习惯带到了 JS 中。但我认为尽量减少不必要的退货是最理想的,尽管我不知道退货的实际成本。

当我查看以下问题的答案时,我对他为什么选择返回一个已经推送到所需数组的变量感到困惑。我认为他的返回是故意的,并且他不打算将返回的变量存储在任何地方。在函数末尾返回变量是否有好处(比如垃圾回收)?

drawImage using toDataURL of an html5 canvas

【问题讨论】:

  • 这是一个见仁见智的问题,但我对一个隐含的 undefined 返回值表示满意,如果找到返回匹配值的函数。尽管您的函数名称hasKeyMatch() 暗示返回将是truefalse,而您返回的值与传递给函数的值相同。因此,在这种情况下(对我而言),如果您返回找到匹配项的数组中的索引,如果未找到则返回 -1 会更有意义。 (这是.indexOf() 所做的。)
  • 我会有一个同名的函数返回truefalse。无论如何,不​​要将密钥作为结果返回 - 如果您寻找一个会评估为虚假的密钥怎么办?该函数会找到它,但会返回一些拒绝的结果。
  • 我更喜欢返回 boolean 值(true/false)与 truelean 值(truthy/not truthy),除非后者有意义(即返回的值本身用于除其真/假性质之外的其他用途。如果返回的值预计可用于其他目的(并且不会改变真/假含义),则返回它。跨度>
  • 对不起,我添加了一个未完善的示例,导致了离题的讨论。我并没有真正寻求实际示例代码的帮助,只是在概念/样式级别上寻求建议。
  • 我不认为讨论离题了,因为返回undefined 是否有意义取决于函数的作用。所以我对函数更新版本的概念/风格建议是,我更喜欢最后一个return false,因为名称hasKeyMatch() 意味着一个布尔返回。 undefined 对我来说只有在函数将返回相关值(如果找到)和 undefined 否则对我来说才有意义,而不是作为一种伪假。

标签: javascript


【解决方案1】:

这是代码可靠性的问题,如果方法名称表明结果,您应该始终返回 false 而不是 undefined。

与代码风格有关的一切都不是对与错的问题 (http://www.youtube.com/watch?v=zN-GGeNPQEg),但如果你想让别人理解你在做什么并避免愚蠢的错误,这一点很重要。可靠的代码通过按预期表现来避免做愚蠢事情的可能性。

例如:isA() &amp;&amp; isB() || !isA() &amp;&amp; !isB() 可以更短的写成isA() == isB()。 如果您将这两个函数定义为一个 (isA) 返回 false,一个 (isB) 返回 undefined,则第二个表达式的行为将不会像人们所怀疑的那样。

见:http://jsfiddle.net/wDKPd/1/

【讨论】:

  • 似乎共识是采取“防御性”方法并始终明确返回。感谢大家的回答,我对此不再有任何不确定性:)。感谢 Scheintod 提供了一个实际示例,说明在哪里依赖 undefined 是行不通的。
【解决方案2】:

我喜欢有预期返回布尔结果的方法(即,以ishas 开头的方法/函数)返回truefalse。当然,JavaScript 可以很容易地返回 undefined,它还会将 truthynessfalsiness 分配给不是 truefalse 的值。我觉得返回truefalse 而不是key 的值更好。无论如何,在这里返回key 有什么用?在调用函数之前,您已经拥有 key 的值。

很难说为什么作者选择返回c把它推入states数组。也许states 数组用于其他用途。

我意识到在 Java 等语言中需要“备份”返回,因此有些人将这种习惯带到了 JS 中

我不完全确定您的意思;我没有发现自己在 Java 中这样做。

【讨论】:

  • 关于你的最后一句话,here is an example。在 Java 中你必须有一个无条件的返回。
  • @Mark: 实际上不是“无条件”ideone.com/RvE4o3
  • @zerkms:对不起,我不清楚,你的场景正是我所说的“无条件”——即,在所有条件下,它都会返回一些东西。我并不是说它不能出现在 if/else 语句中。
  • @Mark:确实,这只是措辞不好。它可能类似于“每个代码分支都应该返回一个声明类型的值”
  • @Mark 感谢您的解释 - 如果方法预期返回某些内容,则每个代码路径都必须导致返回值。
【解决方案3】:

(忽略真假辩论)

我个人不介意返回 undefined 的函数,但我会考虑在末尾添加 return void 0; 以表明它是故意的。函数末尾缺少的 return 语句向我表明它永远不应该到达那里。性能在这里并不是真正的问题。

【讨论】:

    【解决方案4】:

    不是因为你没有在方法语句中指定返回值function hasKeyMatch(key)吗? Java 和其他语言通常要求您指定实际返回的内容。我说如果事情变得混乱,以“默认”返回语句结束语句总是一个好习惯。以防万一。发生了一些奇怪的事情,并且您的代码在特定位置不起作用,它会捕获它并返回有效的东西而不是可能破坏您的代码的未定义的东西。

    编辑:

    如果您也需要指定未定义的返回调用,那总是更好。如果有人正在阅读此代码,他们将无法判断实际返回的内容。这就是脚本语言的问题。

    【讨论】:

    • 我认为你在这里遗漏了一些东西......他知道它返回undefined,这是记录在案的预期行为。一切都没有发生。
    • @Marc 如果您也需要指定未定义的返回调用,那总是更好。如果有人正在阅读此代码,他们将无法判断实际返回的内容。这就是脚本语言的问题。
    • @progrenhard:是的,我同意(因此我的回答)。你最后几句话的措辞表明输出是出乎意料的。 +1 编辑
    • “这就是脚本语言的问题。” - 但是 JS 程序员很好理解,函数默认返回 undefined
    • @Mark 是的,我认为这里真正的问题是 return 语句实际上对性能有多大影响。没什么吗?几乎什么都没有?实际上并没有说明退货声明更糟,因为它必须在完全不同的地方才能退货?或者退货声明只是成本高昂?我相信它可以忽略不计。但是,查看 return 语句的成本会很有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多