Как сравнить несуществующий объект JavaScript с undefined без получения ссылочной ошибки?

Я хочу boolean выйти из этого выражения

(task === undefined);

где task является произвольным и вообще не отображается в коде.

Однако, когда я запускаю это в носороге, я получаю ссылку Error. Я ХОЧУ ИСТИНУЮ

Почему я не правду?

Я хочу проверить, определена ли определенная переменная. Как это сделать, если это не сработает?

Ответы

Ответ 1

Используйте это:

(typeof task === "undefined")

Когда вы используете (task === undefined), Javascript должен найти значение task, чтобы увидеть, совпадает ли оно с undefined, но оно не может найти имя, потому что оно не существует, что дает вам эталонная ошибка. typeof особенность в том, что он может безопасно возвращать тип имени, которого не существует.

Ответ 2

Добавление к принятому ответу, чтобы понять, почему он не работает с некоторыми примерами, вы можете попробовать себя в консоли javascript.

Сравнение непосредственно с типом undefined работает только в том случае, если существует переменная. Ниже приведен вывод, который вы получите в браузере Google Chrome:

> task === undefined
  ReferenceError: task is not defined

Однако, если существует переменная , она будет работать:

// continued from above
> var task
  undefined
> task === undefined
  true

Вот почему вы должны использовать решение typeof вместо этого, потому что оно будет работать в всех случаях, не бросая ошибки (и нарушая выполнение кода javascript).

// continued from above
> typeof notavariable === 'undefined'
  true
> typeof task === 'undefined'
  true

Обратите внимание, что вам не нужна проверка typeof в некоторых случаях, например свойства в объектном литерале:

// continued from above
> var obj = {}
  undefined
> obj.test === undefined
  true
> obj.test = 1
  1
> obj.test === undefined
  false

Это связано с тем, что свойства объекта ведут себя как значения в ассоциативном массиве:

// continued from above
> obj["test"]
  1
> obj["test"] === undefined
  false

Однако вы не всегда можете быть уверены, что это случай в функции, в которой вы не контролируете ввод аргумента:

// continued from above
> function TestFunc(arg1) { console.log(arg1) }
  undefined
> TestFunc(notavariable)
  ReferenceError: notavariable is not defined
> TestFunc(task)
  undefined
  undefined
> TestFunc(obj["lol"])
  undefined
  undefined

Надеемся, что это упражнение поможет вам понять, почему это сравнение.