从javascript函数返回`undefined`或`null`更好吗?

Jer*_*art 68 javascript null return function undefined

我有一个我写的功能,基本上看起来像这样:

function getNextCard(searchTerms) {
  // Setup Some Variables

  // Do a bunch of logic to pick the next card based on termed passed through what I'll call here as 'searchTerms' all of this logic is omitted because it's not important for my question.
  // ...

  // If we find a next card to give, than give it
  if (nextCardFound)
    return nextCardFound;

  // Otherwise - I'm returning undefined
  return undefined;
}
Run Code Online (Sandbox Code Playgroud)

问题:在这里返回"null"会更好吗?

我可以通过我想要的任何东西 - 显然......我只是不确定什么是最好用的东西.

调用此函数的代码知道如何处理未定义的(除非出现可怕的错误,否则实际上不会真正发生)

我问这个问题的原因是我听到某些地方听起来像"不要将未定义的变量分配给变量"或其他东西 - 它会使调试变得更难.所以,我可以看到null传回来的事实告诉我返回工作 - 但基本上功能类似于undefined.


文档:

Mozilla Docs没有回答我的问题...谷歌也没有回答:

这个SO问题 - 对于我在这里想要解决的问题来说太宽泛了.

chi*_*NUT 90

未定义通常是指尚未分配值的东西(尚未).Null指的是绝对没有价值的东西.在这种情况下,我建议返回null.请注意,没有指定返回值的函数会隐式返回undefined.

来自ECMAScript2015规范

4.3.10未定义的值

未赋值变量时使用的原始值

4.3.12空值

原始值,表示故意缺少任何对象值

http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type

进一步阅读:

什么时候在JavaScript中使用null或undefined?

  • @Oriol,在我看来,由于 void 函数返回 undefined,这是该类型函数的保留值,因此在处理函数的返回值时, null 告诉我它决定返回 null,而 undefined 告诉我它要么决定返回未定义,要么决定不返回任何内容,但我不确定是哪一个。此外,如果我正在执行“var x=someFunc();”,我是故意分配 xa 值,并且宁愿它不通过任何表明它尚未(或可能尚未)被分配值的测试。只是恕我直言 (3认同)
  • 是的,未定义是当变量尚未赋值时使用的值。为什么这意味着你不应该在函数中返回 undefined ? (2认同)
  • 是的,这是有道理的。公平地说,我不介意使用一个而不是另一个(尽管我更习惯“null”),只要你坚持使用一个,但有 2 个值来指示值的缺失(无论“类型”是什么)总是令人困惑 (2认同)

Ori*_*iol 26

我认为没有最好的方法,甚至标准功能有时会选择其中一种.

例如:

  • [[原型]]

    普通对象有一个[[Prototype]]内部槽,它决定了它们从哪个其他对象继承.当然,必须有一种方法可以说对象不会从任何其他对象继承.在这种情况下,使用表示"没有这样的对象" null.

  • Object.getOwnPropertyDescriptor

    期望返回属性描述符,即描述属性的对象(例如,值,可写性,可枚举性和可配置性).但是,该财产可能不存在.在这种情况下,使用表示"没有这样的属性" undefined.

  • document.getElementById

    期望返回具有给定ID的元素.但是,可能没有该ID的元素.在这种情况下,使用表示"没有这样的元素" null.

因此,只需选择您喜欢的任何内容,或者认为对您的具体情况更有意义.

  • 在[阅读本文]之后(http://ryanmorr.com/exploring-the-eternal-abyss-of-null-and-undefined/)我决定为这个答案的未来观众推荐`void 0`技术.我还添加了一些代码,试图让你的观点更清晰.谢谢您的回答! (2认同)

ngr*_*man 23

我将以两种方式在两者之间进行选择.

我的简单问题是:给定另一个输入/状态/上下文的值是否可以定义为什么?

如果答案是肯定的,那么使用nullelse undefined.更一般地,null当目标对象不存在时,返回对象的任何函数都应该返回.因为它可以存在给定另一个输入/状态/上下文.

null表示给定输入/状态/上下文缺少值.它隐含地意味着价值的概念本身存在于您的应用程序的上下文中,但可能不存在.在您的示例中,存在下一张卡的概念,但卡本身可能不存在.null应该使用.

undefined隐含地表示在您的应用程序的上下文中缺少该值的含义.例如,如果我操作user具有给定属性集的对象,我尝试访问该属性pikatchu.应该将此属性的值设置为,undefined因为在我的上下文中,拥有这样的属性没有任何意义.

  • 这对我来说是如此真实。当像函数式程序员一样思考时,IMO 纯函数应该返回“null”,而具有副作用的函数应该返回“undefined”。 (2认同)

FK8*_*K82 5

我认为在这种情况下,null应该退货。

\n\n

如果您从理论计算机科学的角度考虑这个问题,那么undefined用于指示非终止/不可计算性(即部分函数x的未定义点的占位符,通常写为 ff(x) = \xe2\x8a\xa5)。

\n\n

getNextCard然而似乎能够计算下一张卡(如果存在)并且也能够计算是否没有下一张卡。换句话说,该函数是完整的,因为它会针对每个输入而终止。

\n\n

话虽这么说,需要一个特殊的值来表示没有有意义结果的终止(即“没有卡我可以返回此输入”),而这对我来说null不是undefined

\n\n
\n\n

笔记:

\n\n

您可以在其他一些类型语言中看到对此参数的一些支持,以及使用选项类型(有时也称为可为null 类型)表示没有有意义结果的终止。Haskell中的Maybe就是一个例子。

\n\n

另一方面,我们当然不知道undefinedJavaScript 中的真正含义。因此,与未定义的类比有点站不住脚。此外,由于我们总是希望使用全部函数,这相当于说“永远不会undefined从函数返回”。这似乎有点严格,因为它会限制undefined对尚未设置的属性/变量的使用。

\n\n

最后,我个人的偏好是永远不会返回undefined我可以返回的地方null,并且我还认为这是更好的编码约定(因为除其他外,x !== null它比 更短typeof x !== \'undefined\')。

\n


归档时间:

查看次数:

49964 次

最近记录:

6 年,4 月 前