默认情况下,为什么函数返回`undefined`而不是`null`?

9
为什么JavaScript函数默认返回undefined而不是null?这是规范的完全任意选择,还是在这种特定选择中可以理解更大的ECMAScript行为上下文?
function a() {}
a();
// undefined

nullundefined有什么区别?undefined作为默认返回值更合适是基于规范的原因还是任意选择?


3
为什么会在存在undefined值的情况下期待出现null - Quentin
1
可能是What does javascript function return in the absence of a return statement?的重复问题。 - But I'm Not A Wrapper Class
你需要询问设计该编程语言的人,而不是 Stack Overflow。 - Felix Kling
我进行了澄清性的编辑,以避免可能的关闭;如果您不喜欢它,请随意回滚或进行更多编辑。 - apsillers
@FelixKling,我已经完成了,正在等待答复。https://twitter.com/henricavalcante/status/712991622372298753 - Henri Cavalcante
显示剩余4条评论
7个回答

9
规范中对nullundefined的定义如下:

未定义值

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

空值

表示任何对象值的有意缺失的原始值

undefined代表未能分配一个值。它是一个值的完全缺席null代表在对象上下文中明确断言的非值。 当期望一个对象但当前值不是对象时,应使用null
鉴于这两个定义,显然undefined是正确的选择,因为:
  1. 函数可以返回除对象之外的值,
  2. 未指定返回值与未分配值之间存在明显的映射关系。

3

3
为什么你期望代码没有定义的东西是null而不是undefined - Quentin
1
这只是预期的行为。这就是语言设计的方式。在JavaScript语言中,未定义和空值是两种不同的类型。 - Steve G.

2

回答你的问题需要几个关键陈述:

JavaScript没有void类型,因此每个函数都必须返回一个值。默认值为undefined,除了构造函数,在构造函数中,默认返回值为this。

undefined和null是两种不同的类型:undefined是一个类型本身(undefined),而null是已定义的。

因此,如果您没有返回任何内容,则必须是没有任何东西,即undefined。


1
null 不是一个对象,**null 是用于对象的**。 - Gopikrishna S
1
null 是 Null 类型。 - Felix Kling

1
ECMAScript规范明确指出,如果没有指定其他返回值,函数将返回undefined。这是该语言的默认行为。
请参见[[Call]]内部方法规范中的最后一步:

9.2.1 [[Call]] ( thisArgument, argumentsList)

使用thisArgument和argumentsList参数调用ECMAScript函数对象F的[[Call]]内部方法,其中argumentsList是一个ECMAScript语言值列表。执行以下步骤:

11. 返回NormalCompletion(undefined)。

请注意,在JavaScript中,nullundefined是两个不同的值。同样,根据规范

4.3.10 未定义的值

当变量没有被赋值时使用的原始值

4.3.12 空值

表示任何对象值的故意缺失的原始值


1

Brendan Eich,JavaScript的创造者,回答了我的推文。

@BrendanEich 为什么JavaScript函数默认返回`undefined`而不是`null`?这只是一项规范还是有原因的呢?

-- Henri Cavalcante on Twitter

@henricavalcante null表示没有对象,undefined表示没有值,是更广泛的类型。你是在问为什么JS中同时存在null和undefined吗?

-- Brendan Eich on Twitter

Answer by Brendan Eich


0

null 是一个定义的值,任何变量都有两种状态,已定义和未定义。

var a; // declared but undefined, has nothing in it; does not mean its null
var b = null; // declared and defined as null;

在JavaScript中,每个函数都有一个隐式返回:return;就像在任何其他语言中一样,用于标记函数的结束。因此,它返回了空值,如果您尝试记录它,它将给出undefined

-1
如果函数返回“undefined”导致问题,您可以使用类代替。它们可以以完全相同的方式访问,但将被视为对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接