2016-03-24 3 views
3

Почему функции JavaScript возвращают undefined по умолчанию вместо null? Является ли это полностью произвольным выбором specification, или существует более обширный контекст поведения ECMAScript, в котором этот конкретный выбор можно понять?Почему функции возвращают `undefined` вместо` null` по умолчанию?

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

В чем разница между null и undefined? Существует ли основанная на спецификации причина, почему undefined более подходит как возвращаемое по умолчанию значение, или это был произвольный выбор?

+2

Почему вы ожидаете 'null', когда существует значение' undefined'? – Quentin

+0

null присваивается вручную. –

+0

IDK, я просто спрашиваю, в PHP у нас нет значения по умолчанию. –

ответ

3

Это часть спецификации. Если явное возвращаемое значение не возвращается из заданной функции, возвращаемое значение всегда будет неопределенным.

Когда в функции вызывается оператор return, выполнение этой функции останавливается. Если указано, данное значение возвращается вызывающему функции. Если выражение опущено, не определено, возвращается вместо

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

+1

Почему не 'null'? –

+3

@HenriCavalcante - Почему вы ожидаете чего-то, что код * не определяет * как 'null' вместо' undefined'? – Quentin

+0

Его просто намеренное поведение. Именно так был разработан язык. Undefined и Null являются двумя отдельными типами на языке javascript. –

1

Несколько ключевых заявлений, чтобы ответить на ваш вопрос

JavaScript не имеет типа пустот, поэтому каждая функция должна возвращать значение. Значение по умолчанию не определено, за исключением конструкторов, где это значение является значением по умолчанию.

undefined и null являются двумя различными типами: undefined - это сам тип (неопределенный), в то время как значение null определено.

Итак, если вы ничего не вернули, это должно быть ничего, т.е. неопределенное.

+1

'null' не является объектом, ** null для объектов ** –

+0

' null' имеет тип Null. –

0

Спецификация ECMAScript явно заявляет, что функции возвращают undefined, если не указана другая обратная связь. Это поведение по умолчанию для языка.

Смотрите последний шаг в [[Call]] internal method specification:

9.2.1 [[Call]] (thisArgument, argumentsList)

Свойство [[Call]] внутренний метод для объекта функции ECMAScript Р вызываемые с параметрами thisArgument и argumentsList, список значений языка ECMAScript. Предпринимаются следующие шаги:

...

11. Возвращение NormalCompletion (неопределенный).

Обратите внимание, что null и undefined два различных значения в JavaScript. Опять же, в соответствии с the specification:

4.3.10 неопределенное значение

примитивным значение, используемое при переменной не было присвоено значение

4,3.12 нулевое значение

примитивного значения, которое представляет собой намеренное отсутствие какого-либо значения объекта

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

3

Спецификация говорит null и undefined:

неопределенное значение

примитивное значение используется, когда переменная не присвоено значение

null значение

примитивного значения, которое представляет собой намеренное отсутствие какого-либо значения объекта

undefined представляет собой неспособность присвоить значение. Это общее отсутствие значения. null представляет собой положительное утверждение неопределенности в контексте объекта. null предназначен для использования, когда ожидается объект, но текущее значение не является объектом.

Учитывая эти два определения, представляется очевидным, что undefined правильный выбор, так как

  1. функция может возвращать другие, чем объекты значений и
  2. отказа указать возвращаемое значение карты аккуратно на провал присвоить значение
Смежные вопросы