Как сравнить несуществующий объект 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
Надеемся, что это упражнение поможет вам понять, почему это сравнение.