为什么JavaScript函数默认返回undefined
而不是null
?这是specification完全随意的选择,还是有更大的ECMAScript行为上下文可以理解这个特定的选择?
function a() {}
a();
// undefined
null
和undefined
之间有什么区别?基于规范的原因是undefined
更适合作为默认返回值,还是任意选择?
答案 0 :(得分:5)
未定义的值
当变量尚未赋值时使用的原始值
空值
表示故意缺少任何对象值的原始值
undefined
表示无法分配值。这是一个值的完全缺席。 null
表示对象上下文中非值的正面断言。 null
旨在在预期对象但当前值为无对象时使用。
鉴于这两个定义,undefined
似乎是正确的选择,因为
答案 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(未定义)。
请注意,null
和undefined
是JavaScript中的两个不同值。再次,根据the specification:
4.3.10未定义值
当变量尚未赋值时使用的原始值
4.3.12空值
表示故意缺少任何对象值的原始值
答案 5 :(得分:0)
JavaScript的创建者Brendan Eich回答了我的推文:https://twitter.com/BrendanEich/status/720863709103435780
答案 6 :(得分:0)
如果函数作为 undefined 出现的事实导致问题,您可以使用类代替。它们可以以完全相同的方式访问,但它会被视为一个对象。