来自 javascript 函数的 return `undefined` 或 `null` 哪个更好?
Is it better to return `undefined` or `null` from a javascript function?
我有一个我写的函数,基本上是这样的:
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;
}
问题:这里return"null"会不会比较好?
我可以传回任何我想要的东西 - 显然......我只是不确定什么是最好的。
调用此函数的代码知道如何处理未定义(实际上它永远不会真正发生,除非出现严重错误)
我问这个问题的原因是我在某处听到听起来像 "Don't assign undefined to variables" 之类的东西 - 它会使调试变得更加困难。所以,我可以看到 null
被传回的事实告诉我 return 正在工作 - 但基本上功能类似于 undefined
.
文档:
Mozilla Docs 没有回答我的问题... google 也没有:\
This SO Question - 对于我在这里想弄清楚的内容来说太宽泛了。
取决于您需要对返回值做什么。
typeof null returns 一个对象。该对象的值为 undefined
类型未定义returns未定义
第一个答案正确。它们在理论上具有不同的含义。然而,并不总是很清楚该选择哪个。
我倾向于在我的开发中使用 null,尽管我认为这完全是主观的事情。
我使用它主要是因为:
undefined 变量可能在旧浏览器中被覆盖,因此返回它有点复杂。同样的问题迫使您在获取函数结果时使用 typeof var === 'undefined'
。 link
其他语言倾向于广泛使用null,其中很多甚至没有undefined(例如php)。在不同语言之间快速切换时,这给了我一种一致性。
未定义通常指的是还没有被赋值的东西(还)。 Null 指的是绝对没有价值的东西。在那种情况下,我会建议 returning 一个空值。请注意,没有指定 return 值的函数隐式 return 未定义。
来自 ECMAScript2015 规范
4.3.10 undefined value
primitive value used when a variable has not been assigned a value
4.3.12 null value
primitive value that represents the
intentional absence of any object value
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
延伸阅读:
When is null or undefined used in JavaScript?
我觉得用什么很值得商榷。我更喜欢在语义上尽可能准确的代码,所以我认为 undefined
在这种情况下是合适的。
我认为 null
赋值意味着 "a variable set to nothing"。这与 undefined
相对,意思是 "this thing isn't there at all"
正如之前的回答所指出的,返回 undefined
有问题,这是否困扰您完全取决于您。它不会打扰我。
undefined
不是你应该分配给的东西。您可能想要考虑 return 除了 undefined
之外的其他东西。在您的情况下,即使您根本不 return 任何东西,结果也已经是 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 条语句的执行。
我认为没有最好的方法,即使是标准函数有时也会选择其中之一。
例如:
[[原型]]
普通对象有一个[[Prototype]]内部插槽,它决定了它们从哪个其他对象继承。当然,必须有一种方法可以说一个对象不从任何其他对象继承。在这种情况下,"there is no such object" 使用 null
.
表示
Object.getOwnPropertyDescriptor
期望return一个属性描述符,即描述属性(例如值、可写性、可枚举性和可配置性)的对象。但是,属性 可能不存在。在这种情况下,"there is no such property" 使用 undefined
.
表示
document.getElementById
预期 return 具有给定 ID 的元素。但是,可能没有具有该 ID 的元素。在这种情况下,"there is no such element" 使用 null
.
表示
因此,只需选择您喜欢或认为对您的具体情况更有意义的内容即可。
我会给出我个人认为的两者之间的选择方式。
我的简单问题是:给定另一个 input/state/context 的值是否可以定义为某物?
如果答案是肯定的,那么使用 null
,否则使用 undefined
。更一般地说,当目标对象不存在时,任何 returning 对象的函数都应该 return null
。因为给定另一个 input/state/context.
它可能存在
null
表示给定 input/state/context 的 值 缺失。它隐含地意味着值本身的 概念 存在于您的应用程序的上下文中,但可能不存在。
在您的示例中,存在下一张卡片的概念,但卡片本身可能不存在。应使用 null
。
undefined
隐式表示该值在您的应用程序上下文中没有意义。例如,如果我使用一组给定的属性操作 user
对象,并尝试访问 属性 pikatchu
。这个 属性 的值应该设置为 undefined
因为在我的上下文中它没有任何意义 属性.
这是一个示例,其中 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
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
无效。
我认为在这种情况下,null
应该 returned。
如果从理论计算机科学的角度考虑问题那么undefined用来表示非终止/不可计算性(即 partial function f
的未定义点 x
的占位符,通常写为 f(x) = ⊥
)。
getNextCard
然而似乎能够计算出下一张牌(如果存在的话)并且如果没有下一张牌也能够计算出。换句话说,该函数是 total 因为它对每个输入都终止。
也就是说,需要一个 特殊值 信号终止而没有有意义的结果(即 "there's no card I can return for this input"),这对我来说是 null
而不是 undefined
。
备注:
您可以在其他一些类型化语言中看到对该参数的一些支持,其中没有有意义结果的终止使用 option type 表示(有时也称为 可空类型 ).例如 Maybe in Haskell.
另一方面,我们当然不知道 JavaScript 中的 undefined
到底是什么意思。因此,与 undefined 的类比有点站不住脚。此外,由于我们总是想使用总函数,所以这相当于说 "never return undefined
from a function"。这似乎有点严格,因为它会将 undefined
的使用限制在尚未设置的属性/变量上。
最后,我个人的偏好永远不会 return undefined
我可以 return null
我也认为这是更好的编码约定(因为 x !== null
比 typeof x !== '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;
}
问题:这里return"null"会不会比较好?
我可以传回任何我想要的东西 - 显然......我只是不确定什么是最好的。
调用此函数的代码知道如何处理未定义(实际上它永远不会真正发生,除非出现严重错误)
我问这个问题的原因是我在某处听到听起来像 "Don't assign undefined to variables" 之类的东西 - 它会使调试变得更加困难。所以,我可以看到 null
被传回的事实告诉我 return 正在工作 - 但基本上功能类似于 undefined
.
文档:
Mozilla Docs 没有回答我的问题... google 也没有:\
This SO Question - 对于我在这里想弄清楚的内容来说太宽泛了。
取决于您需要对返回值做什么。
typeof null returns 一个对象。该对象的值为 undefined
类型未定义returns未定义
第一个答案正确。它们在理论上具有不同的含义。然而,并不总是很清楚该选择哪个。
我倾向于在我的开发中使用 null,尽管我认为这完全是主观的事情。
我使用它主要是因为:
undefined 变量可能在旧浏览器中被覆盖,因此返回它有点复杂。同样的问题迫使您在获取函数结果时使用
typeof var === 'undefined'
。 link其他语言倾向于广泛使用null,其中很多甚至没有undefined(例如php)。在不同语言之间快速切换时,这给了我一种一致性。
未定义通常指的是还没有被赋值的东西(还)。 Null 指的是绝对没有价值的东西。在那种情况下,我会建议 returning 一个空值。请注意,没有指定 return 值的函数隐式 return 未定义。
来自 ECMAScript2015 规范
4.3.10 undefined value
primitive value used when a variable has not been assigned a value
4.3.12 null value
primitive value that represents the intentional absence of any object value
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
延伸阅读:
When is null or undefined used in JavaScript?
我觉得用什么很值得商榷。我更喜欢在语义上尽可能准确的代码,所以我认为 undefined
在这种情况下是合适的。
我认为 null
赋值意味着 "a variable set to nothing"。这与 undefined
相对,意思是 "this thing isn't there at all"
正如之前的回答所指出的,返回 undefined
有问题,这是否困扰您完全取决于您。它不会打扰我。
undefined
不是你应该分配给的东西。您可能想要考虑 return 除了 undefined
之外的其他东西。在您的情况下,即使您根本不 return 任何东西,结果也已经是 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 条语句的执行。
我认为没有最好的方法,即使是标准函数有时也会选择其中之一。
例如:
[[原型]]
普通对象有一个[[Prototype]]内部插槽,它决定了它们从哪个其他对象继承。当然,必须有一种方法可以说一个对象不从任何其他对象继承。在这种情况下,"there is no such object" 使用
null
. 表示
Object.getOwnPropertyDescriptor
期望return一个属性描述符,即描述属性(例如值、可写性、可枚举性和可配置性)的对象。但是,属性 可能不存在。在这种情况下,"there is no such property" 使用
undefined
. 表示
document.getElementById
预期 return 具有给定 ID 的元素。但是,可能没有具有该 ID 的元素。在这种情况下,"there is no such element" 使用
null
. 表示
因此,只需选择您喜欢或认为对您的具体情况更有意义的内容即可。
我会给出我个人认为的两者之间的选择方式。
我的简单问题是:给定另一个 input/state/context 的值是否可以定义为某物?
如果答案是肯定的,那么使用 null
,否则使用 undefined
。更一般地说,当目标对象不存在时,任何 returning 对象的函数都应该 return null
。因为给定另一个 input/state/context.
null
表示给定 input/state/context 的 值 缺失。它隐含地意味着值本身的 概念 存在于您的应用程序的上下文中,但可能不存在。
在您的示例中,存在下一张卡片的概念,但卡片本身可能不存在。应使用 null
。
undefined
隐式表示该值在您的应用程序上下文中没有意义。例如,如果我使用一组给定的属性操作 user
对象,并尝试访问 属性 pikatchu
。这个 属性 的值应该设置为 undefined
因为在我的上下文中它没有任何意义 属性.
这是一个示例,其中 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
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
无效。
我认为在这种情况下,null
应该 returned。
如果从理论计算机科学的角度考虑问题那么undefined用来表示非终止/不可计算性(即 partial function f
的未定义点 x
的占位符,通常写为 f(x) = ⊥
)。
getNextCard
然而似乎能够计算出下一张牌(如果存在的话)并且如果没有下一张牌也能够计算出。换句话说,该函数是 total 因为它对每个输入都终止。
也就是说,需要一个 特殊值 信号终止而没有有意义的结果(即 "there's no card I can return for this input"),这对我来说是 null
而不是 undefined
。
备注:
您可以在其他一些类型化语言中看到对该参数的一些支持,其中没有有意义结果的终止使用 option type 表示(有时也称为 可空类型 ).例如 Maybe in Haskell.
另一方面,我们当然不知道 JavaScript 中的 undefined
到底是什么意思。因此,与 undefined 的类比有点站不住脚。此外,由于我们总是想使用总函数,所以这相当于说 "never return undefined
from a function"。这似乎有点严格,因为它会将 undefined
的使用限制在尚未设置的属性/变量上。
最后,我个人的偏好永远不会 return undefined
我可以 return null
我也认为这是更好的编码约定(因为 x !== null
比 typeof x !== 'undefined'
短)。