Как лучше всего проверить, есть ли свойство объекта в JavaScript undefined
?
источник
Как лучше всего проверить, есть ли свойство объекта в JavaScript undefined
?
Обычный способ проверить, является ли значение свойства особым значением undefined
, это:
if(o.myProperty === undefined) {
alert("myProperty value is the special value `undefined`");
}
Чтобы проверить, действительно ли объект не имеет такого свойства и, следовательно, вернется undefined
по умолчанию при попытке доступа к нему:
if(!o.hasOwnProperty('myProperty')) {
alert("myProperty does not exist");
}
Чтобы проверить, является ли значение, связанное с идентификатором, специальным значением undefined
, или этот идентификатор не был объявлен. Примечание: этот метод является единственным способом ссылки на необъявленный (примечание: отличается от значения undefined
) идентификатор без ранней ошибки:
if(typeof myVariable === 'undefined') {
alert('myVariable is either the special value `undefined`, or it has not been declared');
}
В версиях JavaScript до ECMAScript 5 свойство с именем «undefined» в глобальном объекте было доступно для записи, и поэтому простая проверка foo === undefined
могла бы привести к неожиданным результатам, если бы она была случайно переопределена. В современном JavaScript свойство доступно только для чтения.
Однако в современном JavaScript «undefined» не является ключевым словом, и поэтому переменные внутри функций могут быть названы «undefined» и скрывать глобальное свойство.
Если вас беспокоит этот (маловероятный) крайний случай, вы можете использовать оператор void для получения самого специального undefined
значения:
if(myVariable === void 0) {
alert("myVariable is the special value `undefined`");
}
obj !== undefined
сейчас.undefined
имел обыкновение быть изменчивым, какundefined = 1234
то, что вызвало бы интересные результаты. Но после Ecmascript 5 он больше не доступен для записи, поэтому мы можем использовать более простую версию. codereadability.com/how-to-check-for-undefined-in-javascriptЯ считаю, что есть ряд неправильных ответов на эту тему. Вопреки распространенному мнению, «undefined» не является ключевым словом в JavaScript и может фактически иметь присвоенное ему значение.
Правильный код
Самый надежный способ выполнить этот тест:
Это всегда будет возвращать правильный результат, и даже обрабатывает ситуацию, когда
myVar
не объявлено.Вырожденный код. НЕ ИСПОЛЬЗУЙТЕ.
Кроме того,
myVar === undefined
возникнет ошибка в ситуации, когда myVar не объявлен.источник
=== undefined
изумление. Да, вы можете назначитьundefined
, но для этого нет законных оснований, и вполне предсказуемо, что это может нарушить ваш код. В C вы можете#define true false
, а в Python вы можете назначитьTrue
иFalse
, но люди не чувствуют необходимости разрабатывать свой код на этих языках таким образом, чтобы защитить себя от возможности умышленного саботажа своей собственной среды в другом месте кода. , Почему возможность присвоенияundefined
даже стоит рассмотреть здесь?void 0
чтобы получить значение, на котороеundefined
указывает. Так что вы можете сделатьif (myVar === void 0)
.0
не является специальным, вы можете буквально поместить любое выражение там.undefined
. MDN: не определеноНесмотря на то, что здесь яростно рекомендуют многие другие ответы,
typeof
это плохой выбор . Он никогда не должен использоваться для проверки, имеют ли переменные значениеundefined
, потому что он действует как комбинированная проверка значенияundefined
и наличия переменной. В подавляющем большинстве случаев вы знаете, когда существует переменная, иtypeof
просто представите возможность тихого сбоя, если вы сделаете опечатку в имени переменной или в строковом литерале'undefined'
.Так что, если вы не делаете обнаружение функций², где есть неопределенность, будет ли данное имя находиться в области видимости (например, проверка
typeof module !== 'undefined'
в качестве шага в коде, специфичном для среды CommonJS),typeof
это вредный выбор при использовании с переменной, и правильная опция сравнить значение напрямую:Некоторые распространенные заблуждения по этому поводу включают в себя:
что чтение «неинициализированной» переменной (
var foo
) или параметра (function bar(foo) { … }
называемого какbar()
) не удастся. Это просто неверно - переменные без явной инициализации и параметры, которым не были заданы значения, всегда становятсяundefined
и всегда находятся в области видимости.это
undefined
может быть перезаписано. Это намного больше.undefined
не является ключевым словом в JavaScript. Это свойство глобального объекта с неопределенным значением. Однако, начиная с ES5, это свойство доступно только для чтения и не настраивается . Ни один современный браузер не позволитundefined
изменить свойство, и с 2017 года это имело место в течение длительного времени. Отсутствие строгого режима также не влияетundefined
на поведение - он просто делает заявления типаundefined = 5
ничего не делать вместо броска. Поскольку это не ключевое слово, вы можете объявлять переменные с именемundefined
, и эти переменные можно изменить, создав такой некогда общий шаблон:более опасно, чем использование глобального
undefined
. Если вам нужно быть совместимымundefined
с ES3, замените наvoid 0
- не прибегайте кtypeof
. (void
всегда был унарным оператором, который оценивается как неопределенное значение для любого операнда.)С тем, как переменные работают вне пути, пришло время обратиться к фактическому вопросу: свойствам объекта. Нет никаких причин когда-либо использовать
typeof
для свойств объекта. Более раннее исключение, касающееся обнаружения признаков, здесь не применимо -typeof
имеет специальное поведение только для переменных, а выражения, которые ссылаются на свойства объекта, не являются переменными.Эта:
это всегда точно эквивалент в this³:
и принимая во внимание приведенный выше совет, чтобы не вводить читателей в заблуждение относительно того, почему вы используете
typeof
, потому что это имеет смысл использовать===
для проверки на равенство, потому что это может быть реорганизовано для проверки значения переменной позже, и потому что это просто выглядит лучше, вы всегда должны использовать=== undefined
³ и здесь .Когда дело доходит до свойств объекта, нужно еще кое-что рассмотреть, действительно ли вы вообще хотите проверять
undefined
. Заданное имя свойства может отсутствовать в объекте (создавая значениеundefined
при чтении), присутствовать в самом объекте со значениемundefined
, присутствовать в прототипе объекта со значениемundefined
или присутствовать в любом изundefined
значений, не имеющих значения.'key' in obj
скажет вам, находится ли ключ где-нибудь в цепочке прототипов объекта, иObject.prototype.hasOwnProperty.call(obj, 'key')
скажет, находится ли он непосредственно в объекте. Я не буду вдаваться в подробности в этом ответе о прототипах и использовании объектов в качестве карт со строковыми ключами, потому что он в основном предназначен для противодействия всем плохим советам в других ответах независимо от возможных интерпретаций исходного вопроса. Следить за публикациямиОбъектные прототипы на MDN больше!¹ необычный выбор примера имени переменной? это настоящий мертвый код из расширения NoScript для Firefox.
² не думайте, что не зная, что находится в области видимости, в целом все же хорошо. бонусная уязвимость, вызванная злоупотреблением динамической областью действия: Project Zero 1225
³ снова предполагает среду ES5 +, которая
undefined
относится кundefined
свойству глобального объекта. подставьvoid 0
иначе.источник
undefined
, скрывая контекст по умолчанию. Что для большинства практических целей имеет тот же эффект, что и перезапись.void 0
для сравнения с неопределенным, но опять же - это глупо и излишне.typeof something === "undefined")
в коде.void 0
(на этот раз) и короче, и безопаснее! Это победа в моей книге.В JavaScript есть ноль и есть неопределенный . У них разные значения.
Марин Хавербеке в своей бесплатной онлайн-книге « Красноречивый JavaScript » (выделено мной) утверждает :
Итак, я думаю, что лучший способ проверить, было ли что-то неопределенным, было бы:
Надеюсь это поможет!
Редактировать: в ответ на ваше редактирование свойства объекта должны работать так же.
источник
undefined
это просто переменная, которая может быть переназначена пользователем: записьundefined = 'a';
приведет к тому, что ваш код перестанет делать то, что вы думаете. Использованиеtypeof
лучше, а также работает с переменными (не только свойствами), которые не были объявлены.Что это значит: «неопределенное свойство объекта» ?
На самом деле это может означать две совершенно разные вещи! Во-первых, это может означать свойство, которое никогда не было определено в объекте, и, во-вторых, это может означать свойство, которое имеет неопределенное значение . Давайте посмотрим на этот код:
Не
o.a
определено? Да! Его значение не определено. Неo.b
определено? Конечно! Нет свойства 'b' вообще! Хорошо, теперь посмотрим, как разные подходы ведут себя в обеих ситуациях:Мы можем ясно видеть это
typeof obj.prop == 'undefined'
иobj.prop === undefined
эквивалентны, и они не различают эти разные ситуации. И'prop' in obj
может обнаружить ситуацию, когда свойство вообще не было определено и не обращает внимания на значение свойства, которое может быть неопределенным.Так что делать?
1) Вы хотите знать, является ли свойство неопределенным по первому или второму значению (наиболее типичная ситуация).
2) Вы хотите просто знать, имеет ли объект какое-либо свойство и не заботиться о его значении.
Ноты:
x.a === undefined
или этоtypeof x.a == 'undefined'
повышается,ReferenceError: x is not defined
если x не определен.undefined
является глобальной переменной (так на самом деле этоwindow.undefined
в браузерах). Он поддерживается с ECMAScript 1st Edition, а с ECMAScript 5 - только для чтения . Так что в современных браузерах это нельзя переопределить как истинное, поскольку многие авторы любят пугать нас, но это все еще верно для старых браузеров.Финальный бой:
obj.prop === undefined
противtypeof obj.prop == 'undefined'
Плюсы
obj.prop === undefined
:undefined
Минусы
obj.prop === undefined
:undefined
может быть переопределено в старых браузерахПлюсы
typeof obj.prop == 'undefined'
:Минусы
typeof obj.prop == 'undefined'
:'undefned'
( опечатка ) это просто строковая константа, поэтому движок JavaScript не может помочь вам, если вы ошиблись, как я только что сделал.Обновление (для серверного JavaScript):
Node.js поддерживает глобальную переменную
undefined
какglobal.undefined
(ее также можно использовать без префикса 'global'). Я не знаю о других реализациях серверного JavaScript.источник
undefined
что она является членомglobal
. Также ни,console.log(global);
ниfor (var key in global) { ... }
не показывает undefined в качестве члена глобальной . Но проверить, как'undefined' in global
показать обратное.[[Enumerable]]
это ложь :-)Minuses of typeof obj.prop == 'undefined'
этого можно избежать, написав какtypeof obj.prop == typeof undefined
. Это также дает очень хорошую симметрию.obj.prop === undefined
.if ('foo' in o
)… ваш ответ действительно первый правильный ответ здесь. Практически все остальные просто отвечают на это предложение.Проблема сводится к трем случаям:
undefined
.undefined
.Это говорит нам кое-что, что я считаю важным:
Существует разница между неопределенным членом и определенным членом с неопределенным значением.
Но, к сожалению
typeof obj.foo
, не говорит нам, какой из трех случаев у нас есть. Однако мы можем комбинировать это с тем,"foo" in obj
чтобы различать случаи.Стоит отметить, что эти тесты одинаковы для
null
записей тожеЯ бы сказал, что в некоторых случаях имеет смысл (и понятнее) проверить, присутствует ли свойство, а не проверить, является ли оно неопределенным, и единственный случай, когда эта проверка будет отличаться, - это случай 2, редкий случай фактическая запись в объекте с неопределенным значением.
Например: я только что провела рефакторинг группы кода, которая провела несколько проверок, имеет ли объект заданное свойство.
Что было понятнее, когда написано без проверки неопределенности.
Но, как уже упоминалось, это не совсем то же самое (но более чем достаточно для моих нужд).
источник
if (!("x" in blob)) {}
с скобками во всем, потому что! Оператор имеет приоритет над «в». Надеюсь, что это помогает кому-то.a = {b: undefined}
; тогдаtypeof a.b === typeof a.c === 'undefined'
но'b' in a
и!('c' in a)
.{ x : undefined }
или, по крайней мере, добавить ее в качестве другой альтернативы (2.) в таблице - мне пришлось немного подумать, чтобы понять, что точка (2.) оцениваетundefined
(хотя Вы упоминаете об этом позже).Это сработало для меня, а другие нет.
источник
typeof (something == "undefined")
.(typeof something) === "undefined"
.Я не уверен, откуда исходит происхождение использования
===
withtypeof
, и как соглашение я вижу, что он используется во многих библиотеках, но оператор typeof возвращает строковый литерал, и мы знаем это заранее, так почему бы вам также захотеть ввести проверить это тоже?источник
==
прежнему требуется как минимум проверка типа - интерпретатор не может сравнить два операнда, не зная сначала их тип.==
на один персонаж меньше, чем===
:)Перекрестный ответ на мой ответ по связанному вопросу Как проверить наличие «неопределенного» в JavaScript?
Специфично для этого вопроса, см. Контрольные примеры с
someObject.<whatever>
.Некоторые сценарии, иллюстрирующие результаты различных ответов: http://jsfiddle.net/drzaus/UVjM4/
(Обратите внимание, что использование
var
дляin
тестов имеет значение, когда используется оболочка с ограничением объема)Код для справки:
И результаты:
источник
Если вы делаете
произойдет сбой, когда переменная
myvar
не существует, потому что myvar не определен, поэтому скрипт не работает и тест не имеет никакого эффекта.Поскольку объект окна имеет глобальную область видимости (объект по умолчанию) вне функции, объявление будет «прикреплено» к объекту окна.
Например:
Глобальная переменная myvar такая же, как window.myvar или window ['myvar']
Чтобы избежать ошибок при проверке существования глобальной переменной, лучше использовать:
Вопрос, действительно ли переменная существует, не имеет значения, ее значение неверно. В противном случае глупо инициализировать переменные с неопределенным, и лучше использовать значение false для инициализации. Когда вы знаете, что все переменные, которые вы объявляете, инициализируются с помощью false, вы можете просто проверить их тип или положиться,
!window.myvar
чтобы проверить, имеет ли оно правильное / правильное значение. Таким образом, даже если переменная не определена, то!window.myvar
то же самое дляmyvar = undefined
илиmyvar = false
илиmyvar = 0
.Когда вы ожидаете определенного типа, проверьте тип переменной. Чтобы ускорить тестирование состояния, вам лучше сделать:
Когда первое и простое условие выполняется, интерпретатор пропускает следующие тесты.
Всегда лучше использовать экземпляр / объект переменной, чтобы проверить, получило ли оно допустимое значение. Это более стабильный и лучший способ программирования.
(У)
источник
Я не видел (надеюсь, что не пропустил) никого, кто проверял объект перед собственностью. Итак, это самый короткий и самый эффективный (хотя и не обязательно самый понятный):
Если obj или obj.prop не определены, имеют значение null или «ложь», оператор if не выполнит блок кода. Это обычно желаемое поведение в большинстве операторов блока кода (в JavaScript).
источник
var x = obj && obj.prop || 'default';
В статье « Изучение бездны нуля и неопределенности в JavaScript» я прочитал, что фреймворки, такие как Underscore.js, используют эту функцию:
источник
void 0
это всего лишь краткий способ записиundefined
(так как void, за которым следует любое выражение, возвращается), он сохраняет 3 символа. Это тоже можно сделатьvar a; return obj === a;
, но это еще один персонаж. :-)void
является зарезервированным словом, в то время какundefined
это не то , аundefined
равноvoid 0
по умолчанию, вы можете присвоить значение ,undefined
напримерundefined = 1234
.isUndefined(obj)
: 16 символовobj === void 0
: 14 символов - сказал он.Просто что-то не определено в JavaScript, не определено , не имеет значения, является ли оно свойством внутри Object / Array или просто как переменная ...
JavaScript имеет
typeof
очень простое обнаружение неопределенной переменной.Просто проверьте
typeof whatever === 'undefined'
, вернется ли логическое значение.Вот как
isUndefined()
пишется знаменитая функция в AngularJs v.1x:Итак, как вы видите, функция получает значение, если это значение определено, оно вернется
false
, в противном случае для неопределенных значений вернетсяtrue
.Итак, давайте посмотрим, какими будут результаты, когда мы передаем значения, включая свойства объекта, как показано ниже, это список переменных, которые у нас есть:
и мы проверяем их, как показано ниже, вы можете увидеть результаты перед ними в качестве комментария:
Как вы видите, мы можем проверить что угодно, используя что-то подобное в нашем коде, как уже упоминалось, вы можете просто использовать его
typeof
в своем коде, но если вы используете это снова и снова, создайте функцию, подобную угловому образцу, которую я разделяю, и продолжаю использовать ее как следующий шаблон кода СУХОЙ.Также еще одна вещь, для проверки свойства объекта в реальном приложении, в котором вы не уверены, существует ли этот объект или нет, сначала проверьте, существует ли объект.
Если вы проверите свойство объекта, а объект не существует, вы получите ошибку и остановите работу всего приложения.
Настолько просто, что вы можете заключить в оператор if, как показано ниже:
Что также равно isDefined в Angular 1.x ...
Также другие фреймворки javascript, такие как подчеркивание, имеют аналогичную проверочную проверку, но я рекомендую использовать,
typeof
если вы уже не используете фреймворки.Я также добавляю этот раздел из MDN, в котором есть полезная информация о typeof, undefined и void (0).
больше> здесь
источник
' if (window.x) {} ' безопасен от ошибок
Скорее всего, вы хотите
if (window.x)
. Эта проверка безопасна, даже если x не был объявлен (var x;
) - браузер не выдает ошибку.Пример: я хочу знать, поддерживает ли мой браузер History API
Как это работает:
window - это объект, который содержит все глобальные переменные в качестве своих членов, и разрешено пытаться получить доступ к несуществующему члену. Если x не был объявлен или не был установлен, то
window.x
возвращает undefined . undefined приводит к ложному, когда if () оценивает его.источник
typeof history != 'undefined'
на самом деле работает в обеих системах.Прочитав это, я поражен, что не видел этого. Я нашел несколько алгоритмов, которые будут работать для этого.
Никогда не определен
Если значение объекта никогда не определялось, это предотвратит возврат,
true
если оно определено какnull
илиundefined
. Это полезно, если вы хотите, чтобы true возвращалось для значений, установленных какundefined
Определено как неопределенное или никогда не определено
Если вы хотите, чтобы это приводило
true
к значениям, определенным значениемundefined
или никогда не определенным, вы можете просто использовать=== undefined
Определяется как ложное значение, неопределенное, нулевое или никогда не определяется.
Обычно люди просят у меня алгоритм, чтобы выяснить, является ли значение ложным
undefined
, илиnull
. Следующие работы.источник
if (!obj.prop)
var obj = {foo: undefined}; obj.foo === void 0
->true
. Как это "никогда не определяется какundefined
"? Это не верно.источник
Сравните с
void 0
, для краткости.Это не так многословно, как
if (typeof foo !== 'undefined')
источник
foo
не объявлен.Решение неверное. В JavaScript
вернет true, потому что они оба «приведены» к логическому значению и являются ложными. Правильный способ будет проверить
который является оператором идентичности ...
источник
===
это тип равенства + (примитивное равенство | идентичность объекта), где примитивы включают строки. Я думаю, что большинство людей считают'abab'.slice(0,2) === 'abab'.slice(2)
неинтуитивным, если считать===
оператором идентичности.Вы можете получить массив с неопределенным путем, используя следующий код.
ссылка jsFiddle
источник
getUndefiend
должно бытьgetUndefined
.Вот моя ситуация:
Я использую результат вызова REST. Результат должен быть проанализирован из JSON в объект JavaScript.
Есть одна ошибка, которую я должен защитить. Если аргументы для вызова rest были неверными, поскольку пользователь указал неправильные аргументы, вызов rest возвращается в основном пустым.
Используя этот пост, чтобы помочь мне защититься от этого, я попробовал это.
В моей ситуации, если restResult.data [0] === «объект», я могу смело начинать проверку остальных членов. Если значение не определено, выведите ошибку, как указано выше.
То, что я говорю, - то, что для моей ситуации все предложения выше в этом посте не работали. Я не говорю, что я прав, а все не правы. Я вообще не мастер JavaScript, но, надеюсь, это кому-нибудь поможет.
источник
typeof
охрана на самом деле не защищает ни от чего, с чем не может справиться прямое сравнение. ЕслиrestResult
он не определен или не объявлен, он все равно выбросит.if(!restResult.data.length) { throw "Some error"; }
Существует хороший и элегантный способ назначить определенное свойство новой переменной, если оно определено, или назначить ему значение по умолчанию в качестве запасного, если оно не определено.
Это подходит, если у вас есть функция, которая получает дополнительное свойство конфигурации:
Сейчас исполняю
источник
Все ответы неполные. Это правильный способ узнать, что существует свойство, определенное как неопределенное:
Пример:
Жаль, что это был правильный ответ, похоронен в неправильных ответах> _ <
Так что, для тех, кто проходит мимо, я дам вам неопределенные бесплатно !!
источник
Проходя по комментариям, для тех, кто хочет проверить, является ли он неопределенным или его значение равно нулю:
Если вы используете библиотеку jQuery, то
jQuery.isEmptyObject()
будет достаточно для обоих случаев,источник
Если вы используете Angular:
Underscore.js:
источник
1
в переменнуюx
? Нужно ли Underscore или JQuery? (Удивительно, что люди будут использовать библиотеки даже для самых элементарных операций, таких какtypeof
проверка)Я использую,
if (this.variable)
чтобы проверить, если это определено. Простоеif (variable)
, рекомендованное выше , для меня не получается. Оказывается, это работает только тогда, когда переменная является полем некоторого объекта,obj.someField
чтобы проверить, определена ли она в словаре. Но мы можем использоватьthis
илиwindow
как объект словаря, поскольку любая переменная является полем в текущем окне, насколько я понимаю. Поэтому вот тестСначала он обнаруживает, что переменная
abc
не определена, и определяется после инициализации.источник
Я предлагаю три способа для тех, кто ожидает странных ответов:
isUndefined1:
Попробуйте получить свойство входного значения, проверьте сообщение об ошибке, если оно существует. Если входное значение не определено, сообщение об ошибке будет Uncaught TypeError: Невозможно прочитать свойство 'b' из неопределенного
isUndefined2:
Преобразуйте входное значение в строку для сравнения
"undefined"
и убедитесь, что это отрицательное значение.isUndefined3:
В js необязательный параметр работает, когда входное значение точно
undefined
.источник
В ES2019 появилась новая функция - необязательная цепочка, которую вы можете использовать для использования свойства объекта, только когда объект определен следующим образом:
Он будет ссылаться на свойство телефона только тогда, когда определены user и contactDetails.
Ссылка https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
источник
Возвращает false, если переменная установлена, и true, если не определено.
Тогда используйте:
источник
typeof
тест в функцию. Удивительно, что 4 человека проголосовали за это. -1.Я хотел бы показать вам кое-что, что я использую для защиты
undefined
переменной:Это запрещает кому-либо изменять
window.undefined
значение, поэтому уничтожает код на основе этой переменной. При использовании"use strict"
все попытки изменить его значение будут заканчиваться ошибкой, в противном случае это будет игнорироваться.источник
Вы также можете использовать Proxy, он будет работать с вложенными вызовами, но потребует одну дополнительную проверку:
так что вы будете использовать его так:
источник