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

时间:2016-03-24 13:15:08

标签: javascript function

为什么JavaScript函数默认返回undefined而不是null?这是specification完全随意的选择,还是有更大的ECMAScript行为上下文可以理解这个特定的选择?

function a() {}
a();
// undefined

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

7 个答案:

答案 0 :(得分:5)

规范说明了nullundefined

  

未定义的值

     

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

     

空值

     

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

undefined表示无法分配值。这是一个值的完全缺席null表示对象上下文中非值的正面断言。 null旨在在预期对象但当前值为无对象时使用。

鉴于这两个定义,undefined似乎是正确的选择,因为

  1. 函数可以返回除对象以外的值,
  2. 未能指定返回值会整齐地映射到无法分配值

答案 1 :(得分:3)

该规范的一部分。如果给定函数没有返回显式返回值,则返回值将始终未定义。

  

在函数中调用return语句时,将停止执行此函数。如果指定,则将给定值返回给函数调用者。如果省略表达式,则返回undefined

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return

答案 2 :(得分:2)

很少有关键陈述来回答你的问题

JavaScript没有void类型,因此每个函数都必须返回一个值。默认值是未定义的,但构造函数除外,其中默认返回值为this。

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

所以,如果你什么都没有返回,那么它必须是什么,即未定义。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

如果没有指定其他返回,ECMAScript规范明确声明函数返回undefined。它是该语言的默认行为。

请参阅[[Call]] internal method specification中的最后一步:

  

9.2.1 [[Call]](thisArgument,argumentsList)

     

使用参数thisArgument和argumentsList(ECMAScript语言值列表)调用ECMAScript函数对象F的[[Call]]内部方法。采取以下步骤:

     

...

     

<强> 11。返回NormalCompletion(未定义)。

请注意,nullundefined是JavaScript中的两个不同值。再次,根据the specification

  

4.3.10未定义值

     

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

     

4.3.12空值

     

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

答案 5 :(得分:0)

JavaScript的创建者Brendan Eich回答了我的推文:https://twitter.com/BrendanEich/status/720863709103435780

Answer by Brendan Eich

答案 6 :(得分:0)

如果函数作为 undefined 出现的事实导致问题,您可以使用类代替。它们可以以完全相同的方式访问,但它会被视为一个对象