3

从 JavaScript 函数返回两种不同的类型是错误的吗?这在 PHP 中经常出现。例如 PHP 的strpos()-function 返回一个整数,告诉你位置,如果没有找到则返回 false。在 Java 中这是不可能的,因为它不是一种松散类型的语言,并且返回类型是用函数定义的。

那么在 JavaScript 中做同样的事情是错误的吗?

例如

function num(x, y) {
  if (x !== y) {return false;}
  if (x < 5) {return 5;}
  return x;
}

在上面的示例中,我们返回一个整数或布尔值。但这是错的吗?它会使 JavaScript 引擎的生命变得更加困难,并可能迫使它去优化吗?

或者在另一个示例中,如果我有一个创建元素并尝试将其放入 DOM 的函数然后返回新创建的元素对象。但是,如果它找不到您作为参数发送的父元素,它会返回 false。

4

3 回答 3

2

这没有错,因为 Javascript 是动态类型的。

然而,它通常被认为是坏品味:降低代码的可读性,并可能降低 JIT 技术的翻译效率。

于 2013-09-10T07:22:38.530 回答
2

这完全没有错。您的代码将成功执行其工作。但问题是它不被认为是一个很好的编程实践。虽然没有硬性规定,而且在许多情况下可能需要这种方法,但建议尽可能避免这种方法。

其次,你可以考虑重构你的代码,让它只做一件事。我的建议是将两个'if'分成两种不同的方法。

于 2013-09-10T07:26:27.540 回答
1

这不是严格错误,因为 javascript 是动态类型的。但如果发生这种情况,它可能会隐藏你函数的错误架构。

在某些情况下会发生什么?

在某些情况下,null如果没有结果,JavaScript 核心会返回。是.match函数的情况。在这种情况下,null类似于“我什么都没找到”。

在其他情况下,它返回-1(即.indexOf)。在这种情况下它是合适的,因为返回值应该是一个正整数。-1这是一种告诉我们的方式:“我什么都没找到”或“我没有找到一个正整数”。

那么为什么它会在一种情况下返回,null而以另一种方式返回-1来告诉我们同样的事情呢?

在第一种情况下,match应该返回一个 Array (即一个Object)。在第二种情况下,indexOf应该返回一个整数。So-1比 更合适null,因为null它是 Object 而不是整数。

为什么不undefined呢?因为undefined是未定义的东西,例如:“我什么都没找到,我不知道该怎么告诉你!”。undefined通常在函数应返回 aString但未找到此字符串时使用。Returns""并不优雅,因为它告诉我们:“我找到了字符串,而字符串是空的”。

另一种情况可能是返回 aBoolean但在一种情况下未定义的函数。所以当你问:“这是真的还是假的?” ,它似乎在说:“都不是!” .

一个漂亮的例子是这个函数:

 isAlive(SchroedingersCat); // <--- undefined!!!

如果你的函数应该返回一个 DOM 元素怎么办?

看看在jQuery做什么。

jQuery 总是返回一个Object. 该对象(自身的实例)可以为空,也可以不为空。

var obj = $('#idElement') // <--- return always a jQuery object
if(obj.length == 1) {
     // do something
}

这是一个绝妙的技巧,可以让我们在每次发现某些东西时都无需强制执行连锁检查。

于 2013-09-10T08:13:47.213 回答