9

Why do JavaScript functions return undefined by default instead of null? Is this a totally arbitrary choice by the specification, or is there a larger ECMAScript-behavior context in which this particular choice can be understood?

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

What is the difference between null and undefined? Is there a specification-based reason why is undefined more appropriate as a default return value, or was it an arbitrary choice?

apsillers
  • 112,806
  • 17
  • 235
  • 239
Henri Cavalcante
  • 455
  • 5
  • 16

7 Answers7

9

The specification says of null and undefined:

undefined value

primitive value used when a variable has not been assigned a value

null value

primitive value that represents the intentional absence of any object value

undefined represents a failure to assign a value. It is the total absence of a value. null represents the positive assertion of a non-value in an object context. null is intended to be used when an object is expected but the current value is no-object.

Given these two definitions, it seems obvious that undefined is the correct choice, since

  1. functions can return values other than objects, and
  2. a failure to specify a return value maps neatly onto a failure to assign a value
T.J. Crowder
  • 1,031,962
  • 187
  • 1,923
  • 1,875
apsillers
  • 112,806
  • 17
  • 235
  • 239
3

That's part of the specification. If no explicit return value is returned from a given function, the return value will always be undefined.

When a return statement is called in a function, the execution of this function is stopped. If specified, a given value is returned to the function caller. If the expression is omitted, undefined is returned instead

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

Steve G.
  • 590
  • 5
  • 15
  • 3
    @HenriCavalcante — Why would you expect something that the code *doesn't define* to be `null` instead of `undefined`? – Quentin Mar 24 '16 at 13:28
  • 1
    Its just the intended behavior. That's just the way the language was designed. Undefined and Null are two separate types in the javascript language. – Steve G. Mar 24 '16 at 13:29
2

Few key statements to answer your question

JavaScript does not have a void type, so every function must return a value. The default value is undefined, except for constructors, where the default return value is this.

undefined and null are two distinct types: undefined is a type itself (undefined) while null is defined.

So, if you have returned nothing then it has to be nothing i.e. undefined.

Nikhil Aggarwal
  • 28,197
  • 4
  • 43
  • 59
1

The ECMAScript specification explicitly states that functions return undefined if no other return is specified. It's the default behaviour of the language.

See the last step in the [[Call]] internal method specification:

9.2.1 [[Call]] ( thisArgument, argumentsList)

The [[Call]] internal method for an ECMAScript function object F is called with parameters thisArgument and argumentsList, a List of ECMAScript language values. The following steps are taken:

11. Return NormalCompletion(undefined).

Note that null and undefined are two distinct values in JavaScript. Again, according the the specification:

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

Michał Miszczyszyn
  • 11,835
  • 2
  • 35
  • 53
1

Brendan Eich, creator of JavaScript, answered my tweet.

@BrendanEich Why JavaScript function returns `undefined` by default instead of `null`? Is it just an specification or has a reason for that?

-- Henri Cavalcante on Twitter

@henricavalcante null means no object, undefined means no value, wider type. Are you asking why both null & undefined in JS?

-- Brendan Eich on Twitter

Answer by Brendan Eich

T.J. Crowder
  • 1,031,962
  • 187
  • 1,923
  • 1,875
Henri Cavalcante
  • 455
  • 5
  • 16
0

null is a defined value, there are two states for any variable, defined and undefined.

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

Every function in javascript has a implicit return: return; like in any other language to mark the end of the function. So it returns with nothing, which if you try to log, it will give you undefined

Gopikrishna S
  • 2,221
  • 4
  • 25
  • 39
-1

If the fact that function comes as undefined is causing problems, you can use classes instead. They can be accessed the exact same way, but it will count as an object.

Superman123
  • 11
  • 1
  • 3