我有一个我写的功能基本上是这样的:
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;
}
问题:返回" null"会更好吗?这里吗
我可以通过我想要的任何东西 - 显然......我只是不确定什么是最好用的。
调用此函数的代码知道如何处理未定义的(除非出现可怕的错误,否则实际上它确实会发生)
我提出这个问题的原因是,我听到某些地方听起来像是"不要将undefined分配给变量"或其他东西 - 它会使调试变得更难。所以,我可以看到null
被传回的事实告诉我返回工作 - 但基本上与undefined
类似。
Mozilla Docs没有回答我的问题...谷歌也没有:\
This SO Question - 对于我试图在这里找到的东西来说太宽泛了。
答案 0 :(得分:81)
未定义通常是指尚未分配值的东西(尚未)。 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
进一步阅读:
答案 1 :(得分:23)
我认为没有最好的方法,甚至标准功能有时会选择其中一种。
例如:
[[原型]]
普通对象有一个[[Prototype]]内部插槽,用于确定它们从哪个对象继承。当然,必须有一种方法可以说对象不会从任何其他对象继承。在这种情况下,使用null
表示“没有这样的对象”。
Object.getOwnPropertyDescriptor
期望返回属性描述符,即描述属性的对象(例如,值,可写性,可枚举性和可配置性)。但是,该财产可能不存在。在这种情况下,使用undefined
表示“没有此类属性”。
document.getElementById
应该返回具有给定ID的元素。但是,可能没有该ID的元素。在这种情况下,使用null
表示“没有这样的元素”。
因此,只需选择您喜欢的内容,或者认为对您的具体案例更有意义。
答案 2 :(得分:20)
我会以两种方式选择你的个人观点。
我的简单问题是:是否可以将某个输入/状态/上下文定义为某个值?
如果答案是肯定的,请使用null
否则使用undefined
。更常见的是,当目标对象不存在时,返回对象的任何函数都应返回null
。因为它可以存在给定另一个输入/状态/上下文。
null
表示给定输入/状态/上下文的缺少值。它隐含地意味着值的概念本身存在于您的应用程序的上下文中,但可能不存在。
在您的示例中,存在下一张卡的概念,但卡本身可能不存在。应该使用null
。
undefined
隐含地表示应用程序上下文中缺少含义。例如,如果我使用给定的属性集操纵user
对象,并尝试访问属性pikatchu
。此属性的值应设置为undefined
,因为在我的上下文中,拥有此类属性没有任何意义。
答案 3 :(得分:4)
undefined
不是您应该分配的内容。您可能需要考虑返回undefined
以外的其他内容。在您的情况下,即使您根本没有返回任何内容,结果也会是undefined
。所以,我建议改为使用null
。
考虑这个样本,
function getSomething() {
// .. do something
return undefined;
}
function doSomething() {
// .. I'm not gonna return anything.
}
var a = getSomething();
var b = doSomething();
上面的示例结果为a === b
,即undefined
。不同之处在于您保存了1个语句执行。
答案 4 :(得分:2)
取决于你需要对返回的值做什么。
typeof null返回一个对象。该对象的值为undefined
typeof undefined返回undefined
答案 5 :(得分:2)
以下是undefined
比null
更有意义的示例:
我使用JSON.parse
的包装函数将其异常转换为undefined
:
// parses s as JSON if possible and returns undefined otherwise
// return undefined iff s is not a string or not parseable as JSON; undefined is not a valid JSON value https://stackoverflow.com/a/14946821/524504
function JSON_parse_or_undefined(s) {
if ("string" !== typeof s) return undefined
try {
const p = JSON.parse(s)
return p
} catch (x){}
return undefined
}
请注意,null
在JSON中有效,而undefined
则不是。
答案 6 :(得分:1)
我认为使用什么是非常有争议的。我更喜欢在语义上尽可能准确的代码,因此我认为undefined
在这种情况下是合适的。
我认为null
赋值为含义"变量设置为空"。这与undefined
含义相反#34;这件事根本不存在"
正如之前的回答所指出的那样,回归undefined
会遇到问题,而这完全取决于你是否会困扰你。它不会打扰我。
答案 7 :(得分:1)
我认为在这种情况下,应该返回null
。
如果从理论计算机科学的角度考虑问题,那么 undefined 用于表示非终止 / 不可计算性 (即partial function x
的未定义点f
的占位符,通常写为f(x) = ⊥
)。
getNextCard
似乎能够计算下一张卡(如果它存在),并且还能够计算是否没有下一张卡。换句话说,函数是total,因为它终止于每个输入。
话虽如此,特殊值信令终止没有有意义的结果(即"没有卡我可以为此输入返回")是必需的,这是我是null
而不是undefined
。
备注:强>
您可以在其他一些类型语言中看到对此参数的一些支持,以及使用option type(有时也称为可空类型)表示没有有意义结果的终止。一个例子是 Haskell 中的 Maybe 。
另一方面,我们当然不知道JavaScript中的undefined
究竟是什么意思。因此,与 undefined 的类比有点过分。此外,由于我们总是希望使用总函数,这相当于说'#34;永远不会从函数"返回undefined
。这似乎有点严格,因为它会限制undefined
对尚未设置的属性/变量的使用。
最后,我的个人偏好永远不会返回undefined
我可以返回null
的地方,我也认为这是更好的编码约定(因为除其他事项外x !== null
比typeof x !== 'undefined'
更短。
答案 8 :(得分:0)
第一个答案是对的。它们在理论上具有不同的含义。然而,并不总是清楚哪个拿起。
我倾向于在我的开发中使用null,尽管我认为这完全是主观的。
我之所以使用它主要是因为:
未定义的变量可能会在旧浏览器中被覆盖,因此返回它会稍微复杂一些。同样的问题迫使您在获取函数结果时使用typeof var === 'undefined'
。 link
其他语言往往广泛使用null,其中很多甚至没有undefined(例如php)。这使我在语言之间快速交换时具有一致性。
答案 9 :(得分:0)
根据我的经验,我个人的看法是不要使用undefined和null,如果您不想崩溃的话。至少我个人会避免这样做。 Javascript中有很多函数都返回undefined,好了,我们必须使用它。但是,当您设计代码时,请不要使用它。重要的是至少始终返回"false"
。例如,如果您有一个数组并在其上进行映射。返回[undefined, undefined.....]
或仅返回undefined
是不好的。如果保留原始数组的类型更好。
示例:
const mapper:Map <string[],boolean[]>
['i', 'dont', 'use', 'null or undefined'] -> [false, true, false, true, false]
or ['', dont, '', '', use]
or al the stuff above and then filter(v => v)
that will keep all undefined and null out
就是这个想法。
我一直在努力避免这种情况。因为null
或undefined
可能会使您的代码崩溃