Javascript:不同的返回类型

bsr*_*bsr 7 javascript

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

例如:

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

The*_*heo 7

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

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

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


Tom*_*icz 4

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

somefn({type: 'foo'});  //undefined
Run Code Online (Sandbox Code Playgroud)

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

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

somefn = function(e) {

  switch (e.type) 
  {
    case 'mousedown':
      return {x:10, y:20, down: false};
    case 'mousemove':
      return {x:10, y:20};
    default:
      return {};
  }
};
Run Code Online (Sandbox Code Playgroud)

  • 这很奇怪,我宁愿返回 `null` 而不是创建一个空对象。如果我必须在“{}”和“false”之间进行选择,我会选择“false”,因为至少我可以做一个简单的“if(returnValue)”,这在你的代码中会更复杂......这实际上会是返回*不同*对象(如“false”,但更好的是“null”)的最佳位置,因为我可以通过返回值的布尔值检查总体成功,并在检查通过时将其用作对象。 (2认同)