В PHP вы можете сделать if(isset($array['foo'])) { ... }
. В JavaScript вы часто if(array.foo) { ... }
делаете то же самое, но это не совсем то же самое утверждение. Условие также оценивается как ложное, если array.foo
оно существует, но есть false
или0
(и, возможно, другие значения).
Что является идеальным эквивалентом PHP isset
в JavaScript?
В более широком смысле было бы удобно общее полное руководство по обработке в JavaScript переменных, которые не существуют, переменных без значения и т. Д.
javascript
isset
Барт ван Хейкелом
источник
источник
_.isUndefined(arr.foo)
Ответы:
Я обычно использую
typeof
оператор:Он вернет
"undefined"
либо если свойство не существует, либо его значениеundefined
.(Смотрите также: Разница между
undefined
и не определена. )Есть и другие способы выяснить, существует ли свойство объекта, например,
hasOwnProperty
метод:И
in
оператор:Разница между последними двумя заключается в том, что
hasOwnProperty
метод проверяет, существует ли свойство физически объекта (свойство не наследуется).in
Оператор проверит все свойства досягаемых в цепи прототипов, например:Как видите,
hasOwnProperty
возвращаетсяfalse
иin
оператор возвращаетtrue
при проверкеtoString
метода, этот метод определен в цепочке прототипов, потому чтоobj
наследует формуObject.prototype
.источник
typeof
а неif( obj.foo !== undefined )
?isset($abc->def->ghi->jkl)
без вызова исключения и остановки скрипта, в отличие отtypeof
оператора JavaScript . Вы должны использовать что-то вродеtry{ abc.def.ghi.jkl; isset=true } catch(e){ isset=false }
Вековая ветка, но есть новые способы запуска аналога
isset()
.ESNext (Этап 4 декабря 2019 г.)
Два новых синтаксиса позволяют нам значительно упростить использование
isset()
функциональности:?.
)??
)Пожалуйста, прочитайте документы и обратите внимание на совместимость браузера.
Предыдущий ответ
Смотрите объяснение ниже. Обратите внимание, я использую синтаксис StandardJS
Пример использования
Функция ответа
объяснение
PHP
Обратите внимание, что в PHP вы можете ссылаться на любую переменную на любой глубине - даже попытка получить доступ к не массиву, так как массив вернет простой
true
илиfalse
:JS
В JavaScript у нас нет такой свободы, мы всегда получим ошибку, если сделаем то же самое, потому что JS немедленно пытается получить доступ к значению
deeper
прежде, чем мы сможем обернуть его в нашейisset()
функции, так что ...Больше неудачных альтернатив:
И некоторые рабочие альтернативы, которые могут стать избыточными быстро:
Вывод
Все остальные ответы - хотя большинство из них жизнеспособны ...
isset()
например
isset(some, 'nested.deeper.value')
eval()
который работает, но я лично избегаюЯ думаю, что покрыл многое из этого. В моем ответе есть некоторые моменты, которые я не затрагиваю, потому что они - хотя и актуальны - не являются частью вопроса. Однако при необходимости я могу обновить свой ответ ссылками на некоторые более технические аспекты, основанные на требовании.
Я потратил много времени на это, надеюсь, это поможет людям.
Спасибо за чтение!
источник
phpjs.org в основном на пенсии в пользу locutus Вот новая ссылка http://locutus.io/php/var/isset
источник
isset(abc.def.ghi)
в случае, если значениеabc.def
не определено. Однако, объединяя это решение с тем, которое принимает имя переменной в виде строки, оно будет идентично версии PHP.источник
источник
Это простое решение работает, но не для глубокой проверки объекта.
источник
Я всегда использую эту универсальную функцию для предотвращения ошибок примитивных переменных, а также массивов и объектов.
источник
Если вы используете underscorejs, я всегда использую
источник
Это довольно пуленепробиваемое решение для тестирования, если переменная существует:
К сожалению, вы не можете просто заключить его в функцию.
Вы можете подумать о том, чтобы сделать что-то вроде этого:
Однако это приведет к ошибке ссылки, если переменная
variable
не была определена, потому что вы не можете передать несуществующую переменную в функцию:С другой стороны, это позволяет вам проверить, не определены ли параметры функции:
Даже если никакое значение для
y
не передается функцииtest
, нашаisset
функция прекрасно работает в этом контексте, потому чтоy
в функции она известнаtest
какundefined
значение.источник
!==
уже логический.Это слишком долго писать, когда используется. Но мы не можем упаковать
typeof
ключевое слово в функцию, потому что перед вызовом функции возникнет ошибка, например:Вот я и нашел способ:
Он может работать как с отдельными переменными (переменные, которые вообще не существуют), так и со свойствами объекта (несуществующие свойства). И всего на 7 символов больше, чем в PHP
isset
.источник
Это решение сработало для меня.
источник
isset(var)
сvar
неустановленным:ReferenceError: var is not defined
источник
isset(someVar)
, гдеsomeVar
никогда не было объявлено. Однако, учитывая то, что вы делаетеeval
, вы, вероятно, намереваетесь передать строку . Показать использование. Ваше предполагаемое использованиеisset('someVar')
? Если это так, то это похоже на предыдущий ответ - что нового в вашем ответе?плюс тесты:
https://gist.github.com/daylik/24acc318b6abdcdd63b46607513ae073
источник
Чтобы проверить, существует ли HTML-блок или нет, я использую этот код:
источник
Укажите путь к объекту в виде строки, затем вы можете разбить эту строку на путь и разрешать
hasOwnProperty
на каждом шаге, перезаписывая сам объект при каждой итерации.Если вы программируете в среде ES6, взгляните на этот стековый поток Ques .
источник
Я использую функцию, которая может проверять переменные и объекты. очень удобно работать с jQuery
источник
Это была действительно проблема для меня, когда я обращался к более глубокому свойству объекта, поэтому я создал функцию, которая будет возвращать значение свойства, если существует, в противном случае он вернет false. Вы можете использовать его, чтобы сэкономить ваше время,
источник
Если вы хотите проверить, существует ли элемент, просто используйте следующий код:
Это образец:
источник
источник
Руководство PHP говорит:
И интерфейс примерно так:
bool isset ( mixed $var [, mixed $... ] )
Параметр
$var
- это переменная для проверки. он может иметь любое количество параметров.isset () возвращает,
TRUE
если var существует и имеет значение, отличное отNULL
.FALSE
в противном случае.Пример:
Учитывая это, по-видимому, невозможно написать точный эквивалент
isset()
функции php . Например, когда мы звоним так:Javascript триггер
Uncaught ReferenceError: some_var is not defined at (file_name):line_number
. Важной и замечательной особенностью этого поведения является то, что при попытке передать несуществующие переменные нормальным функциям возникает ошибка.Но в PHP на
isset()
самом деле не обычные функции, а языковые конструкции. Это означает, что они являются частью самого языка PHP, не воспроизводят по обычным правилам функций и, следовательно, могут избежать появления ошибки для несуществующих переменных. Это важно при попытке выяснить, существует ли переменная или нет. Но в javscript он в первую очередь вызывает ошибку, скажем, вызов функции с несуществующими переменными.Я хочу сказать, что мы не можем написать это как эквивалентную функцию javscript, но мы можем сделать что-то вроде этого
Если вы хотите точно такой же эффект, PHP также проверьте varable не
NULL
Например
Итак, мы можем включить это в JavaScript, тогда это будет выглядеть так:
источник
javascript isset
источник
Будьте осторожны в ES6 , все предыдущие решения не работают, если вы хотите проверить объявление переменной let и объявить ее, если это не так
пример
вы увидите ошибку
Решением было изменить его на переменную
другое решение, если вы можете изменить let на var, вам нужно удалить ваш var
источник
источник