Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена в нуль (т. е. она не ссылалась на экземпляр фактического объекта).
Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.
if (myvar != null)
{
// Go ahead and use myvar
myvar.property = ...
}
else
{
// Whoops! myvar is null and cannot be used without first
// assigning it to an instance reference
// Attempting to use myvar here will result in NullReferenceException
}
С Array
оба эквивалентны. new
вводится, когда он вызывается как функция:
15.4.1 Конструктор
Array
, вызываемый как функцияКогда
blockquote>Array
вызывается как а не как конструктор, он создает и инициализирует новый объект Array. Таким образом, вызов функцииArray(…)
эквивалентен выражению создания объектаnew Array(…)
с теми же аргументами.Из ECMA-262, 3-е издание (со схожими в 5th Edition ).
Согласно Javascript: The Definitive Guide (5th Edition), стр. 602: «Когда конструктор Array()
вызывается как функция, без оператора new
он ведет себя точно так же, как и при вызове с new
.
Разница заключается в реализации функции Array. Является ли вызов массива без нового оператора возвратом экземпляра массива или нет, зависит от реализации. Например, движок SpiderMonkey Mozilla делает это:
static JSBool
Array(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
jsuint length;
jsval *vector;
/* If called without new, replace obj with a new Array object. */
Это фактический комментарий от фактического источника. Следующие строки кода здесь не воспроизводятся. Я бы предположил, что другие двигатели делают то же самое. В противном случае поведение не определено. Хорошее чтение на эту тему - сообщение Джона Ресига здесь .