【问题标题】:Javascript: Different return typesJavascript:不同的返回类型
【发布时间】:2011-05-01 15:18:55
【问题描述】:

我看到我可以从 JavaScript 中的同一个函数返回不同的类型。这种做法是惯用的还是应该不鼓励?

例如:

somefn = function(e) {
    switch (e.type) 
    {
       case 'mousedown':
         return false;
       case 'mousemove':
         return {x:10, y:20};
    }
 };

【问题讨论】:

  • 2 票接近,2 票赞成 qn :-) .. 我提到我是这门语言的新手,我知道的所有其他语言都不允许它..
  • 这是惯用的,从某种意义上说它是“不被禁止的”,因为“函数”对象既没有输入也没有输出类型强制,留给程序员来决定。 “return”语句可以返回任何类型的对象,包括函数,甚至什么也不返回。这在某些情况下可能很有用,例如如果匹配则返回字符串,否则返回 false(例如,如果零长度字符串将是有效匹配),或者如果有答案则返回数字,或 null如果不是(例如,X/Y,如果 Y 为零,则它可能返回 null)。

标签: javascript


【解决方案1】:

我会劝阻它。任何使用可以根据上下文返回不同类型的函数的代码都必须检查返回的值。

但是,在某些情况下它是有意义的。假设您有一个解析字符串的函数,例如 JSON。在这种情况下,如果输入字符串是表示数组的 JSON 字符串,如果输入包含对象、布尔值、数字等,则返回数组是很有意义的。

一般来说,做最不会引起意外的事情。例如,你的例子会让我大吃一惊。

【讨论】:

    【解决方案2】:

    请注意,不仅您的函数返回不同的类型,甚至可能不返回任何内容:

    somefn({type: 'foo'});  //undefined
    

    虽然不鼓励上述不一致的返回行为,但返回不同的对象类型是常见的,虽然我不能说它是否是惯用的。

    为了可读性和可维护性,我不建议返回完全不同的对象(例如您的示例中的布尔值和对象字面量),但返回具有略微甚至完全不同属性的对象字面量是很常见的:

    somefn = function(e) {
    
      switch (e.type) 
      {
        case 'mousedown':
          return {x:10, y:20, down: false};
        case 'mousemove':
          return {x:10, y:20};
        default:
          return {};
      }
    };
    

    【讨论】:

    • 这很奇怪,我宁愿返回null 而不是创建一个空对象。如果我必须在{}false 之间进行选择,我会选择false,因为至少我可以做一个简单的if(returnValue),这在你的代码中会更复杂......这实际上是最好的地方返回一个不同的对象(如false,但更好的null),因为我可以通过返回值的布尔值检查总体成功,并在检查通过时将其用作对象。
    • 同意,但是使用空对象文字,您可以安全地执行以下操作:if(somefn(e).down)。猜猜这是一个口味问题:-)。顺便说一句,我真的很希望 if({}) 在 JavaScript 中返回 false...
    【解决方案3】:

    在javascript中一个函数返回不同类型的对象是很常见的,只需编写它,调用它并确定返回值的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2018-07-02
      • 2017-05-24
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多