Мы часто используем следующий шаблон кода в нашем коде JavaScript
if (typeof(some_variable) != 'undefined' && some_variable != null)
{
// Do something with some_variable
}
Есть ли менее подробный способ проверки, который имеет такой же эффект?
По мнению некоторых форумов и литературы, просто следующее должно иметь такой же эффект.
if (some_variable)
{
// Do something with some_variable
}
К сожалению, Firebug оценивает такой оператор как ошибку во время выполнения, когда some_variable
он не определен, тогда как первый подходит для него. Это только (нежелательное) поведение Firebug или действительно есть какая-то разница между этими двумя способами?
javascript
null
undefined
Томас Вана
источник
источник
if(some_variable) { ... }
не выполнится, еслиsome_variable
естьfalse
или0
или ...Ответы:
Вы должны различать случаи:
undefined
или необъявленными . Вы получите ошибку, если получите доступ к необъявленной переменной в любом контексте, кромеtypeof
.Переменная, которая была объявлена, но не инициализирована, является
undefined
.Неопределенные свойства , как
someExistingObj.someUndefProperty
. Неопределенное свойство не приводит к ошибке и просто возвращает значениеundefined
, которое при преобразовании в логическое значение оценивается какfalse
. Так что, если вас не волнует0
иfalse
, использованиеif(obj.undefProp)
в порядке. Есть общая идиома, основанная на этом факте:что означает «если
obj
есть свойствоprop
, присвойте егоvalue
, в противном случае присвойте значение по умолчаниюdefautValue
».Некоторые люди считают, что это поведение сбивает с толку, утверждая, что это приводит к трудно обнаруживаемым ошибкам, и рекомендуют
in
вместо этого использовать оператористочник
undefined
.typeof
возвращает строку. Так что неvar myVar; typeof(myVar)==undefined
возвращается .false
true
Я думаю, что самый эффективный способ проверить на «значение есть
null
илиundefined
» этоИтак, эти две строки эквивалентны:
Примечание 1
Как упоминалось в вопросе, короткий вариант требует, чтобы
some_variable
он был объявлен, в противном случае будет сгенерировано ReferenceError. Однако во многих случаях вы можете предположить, что это безопасно:проверьте наличие необязательных аргументов:
проверить свойства на существующем объекте
С другой стороны,
typeof
может иметь дело с необъявленными глобальными переменными (просто возвращаетundefined
). Тем не менее, как объяснил Альсьенде, эти случаи должны быть сведены к минимуму по веским причинам.Заметка 2
Этот - даже более короткий - вариант не эквивалентен:
так
Заметка 3
В общем, рекомендуется использовать
===
вместо==
. Предлагаемое решение является исключением из этого правила. Проверки синтаксиса JSHint даже предоставляетeqnull
опцию по этой причине.Из руководства по стилю jQuery :
источник
== null
imho наиболее эффективно для проверки на 'null или undefined' (это тема вопросов). Это ни в коем случае не редкость (используется 43 раза в jQuery 1.9.1), так как очень часто вы знаете, что переменная была объявлена - или вы проверяете свойство существующего объекта, напримерif( o.foo == null)
.window.someProperty == null
. Для локальных переменных вы можете легко убедиться, что они объявлены: вместо записиif (...) {var local = ""}
пишитеvar local; if (...) { local = ""; }
Проверка нуля с нормальным равенством также вернет true для неопределенного.
if (window.variable == null) alert('variable is null or undefined');
источник
NaN
из разностного уравнения никогда нельзя ожидать равногоВ более новых стандартах JavaScript, таких как ES5 и ES6, вы можете просто сказать,
все возвращают false, что похоже на проверку пустых переменных в Python. Так что если вы хотите написать условную логику вокруг переменной, просто скажите
здесь «null» или «пустая строка» или «undefined» будут обрабатываться эффективно.
источник
null
аundefined
другие ложные значения должны возвращать true!0
,NaN
. Это для случаев, когда вы хотите зафиксировать истинность объекта, не сохраняя ссылку на объект, чтобы вы могли сохранить его, а не какой-либо потенциально большой объект. К вашему сведению, это также эквивалентно тому!!value
, что первый!
отрицает правдивость, а второй снова отрицает его.if (var)
который будет приведен к логическомуBoolean(undefined)
работает, пробовать это с неопределенной переменной не работает, и в этом весь смысл проверки на нулевой или неопределенный. Это:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }
генерирует ReferenceError, говорящее «ReferenceError: undeclareVarName не определено»Если вы попытаетесь сослаться на необъявленную переменную, во всех реализациях JavaScript будет выдана ошибка.
Свойства объектов не подчиняются тем же условиям. Если свойство объекта не было определено, ошибка не будет выдана, если вы попытаетесь получить к нему доступ. Таким образом, в этой ситуации вы можете сократить:
в
Имея это в виду и тот факт, что глобальные переменные доступны как свойства глобального объекта (
window
в случае браузера), вы можете использовать следующее для глобальных переменных:В локальных областях всегда полезно убедиться, что переменные объявлены в верхней части блока кода, это сэкономит при повторном использовании
typeof
.источник
if (myObj.some_property != null)
чтобы получить эквивалентное поведение.Во-первых, вы должны четко понимать, что вы тестируете. В JavaScript есть все виды неявных преобразований, которые могут вас сбить с толку, и два разных типа компаратора равенства:
==
и===
.Функция,
test(val)
которая проверяетnull
илиundefined
должна иметь следующие характеристики:Давайте посмотрим, какие из идей здесь действительно проходят наше испытание.
Эти работы:
Они не работают:
Я создал запись jsperf, чтобы сравнить правильность и производительность этих подходов. Результаты пока неубедительны, так как не было достаточно прогонов на разных браузерах / платформах. Пожалуйста, найдите минутку, чтобы запустить тест на вашем компьютере!
В настоящее время кажется, что простой
val == null
тест дает лучшую производительность. Это также в значительной степени самый короткий. Тест может быть отменен,val != null
если вы хотите дополнения.источник
это единственный случай, в котором
==
следует использовать:источник
val != null
наоборот, только один,=
и поскольку на @Yukulele это ЕДИНСТВЕННЫЙ,==
вы будете знать, что он делает, когда вы его видите.Поскольку не существует единого полного и правильного ответа, я постараюсь обобщить:
В общем, выражение:
не может быть упрощено, потому что это
variable
может быть необъявленным, поэтому, если пропуститьtypeof(variable) != "undefined"
, в ReferenceError. Но вы можете упростить выражение в соответствии с контекстом :Если
variable
это глобально , вы можете упростить до:Если он локальный , вы можете избежать ситуаций, когда эта переменная не объявлена, а также упростить до:
Если это свойство объекта , вам не нужно беспокоиться о ReferenceError:
источник
navigator
частьюwindow
? Когда мы получим исключение дляnavigator is not defined
, можем ли мы использоватьwindow.navigator != null
тест?Вы можете просто проверить, имеет ли переменная значение или нет. Смысл,
Если вы не знаете, существует ли переменная (то есть, если она была объявлена), вам следует проверить с помощью оператора typeof. например
источник
Я сделал это с помощью этого метода
сохранить идентификатор в некоторой переменной
тогда используйте условие if
источник
Это пример очень редкого случая, когда его рекомендуется использовать
==
вместо===
. Выражениеsomevar == null
вернет true дляundefined
иnull
, но false для всего остального (ошибка, если переменная не объявлена).Использование
!=
перевернет результат, как и ожидалось.Современные редакторы не будут предупреждать об использовании
==
или работе!=
с нимиnull
, так как это почти всегда желаемое поведение.Наиболее распространенные сравнения:
Попробуй сам:
источник
Как упоминалось в одном из ответов, вам может повезти, если вы говорите о переменной, имеющей глобальную область видимости. Как вы, возможно, знаете, переменные, которые вы определяете глобально, как правило, добавляются к объекту windows. Вы можете воспользоваться этим фактом, поэтому допустим, что вы обращаетесь к переменной с именем bleh, просто используйте оператор с двойным инвертированием (!!)
Это вернет false, пока bleh не был объявлен и ему не присвоено значение.
источник
Вот еще один способ использования метода Array include () :
источник
независимо от того, что yyy не определено или равно нулю, оно вернет true
да
нет
источник
Откройте инструменты разработчика в вашем браузере и просто попробуйте код, показанный на рисунке ниже.
источник
Чтобы понять, давайте проанализируем, какое будет значение, возвращаемое Javascript Engine при преобразовании undefined, null и '' (также пустая строка). Вы можете непосредственно проверить то же самое на своей консоли разработчика.
Вы можете видеть, что все преобразуются в ложные, то есть все эти три предполагают «отсутствие существования» в javascript. Так что вам не нужно явно проверять все три в вашем коде, как показано ниже.
Также я хочу отметить еще одну вещь.
Что будет результатом логического (0)?
Конечно ложно. Это создаст ошибку в вашем коде, когда 0 является допустимым значением ожидаемого результата. Поэтому, пожалуйста, убедитесь, что вы проверили это при написании кода.
источник
Подобно тому, что у вас есть, вы могли бы сделать что-то вроде
if (some_variable === undefined || some_variable === null) { do stuff }
источник
Тестирование nullity (
if (value == null)
) или non-nullity (if (value != null)
) менее многословно, чем тестирование статуса определения переменной.Более того, тестирование
if (value)
(илиif( obj.property)
) для обеспечения существования вашей переменной (или свойства объекта) завершается неудачей, если оно определено с помощью логическогоfalse
значения. Пусть покупатель будет бдителен :)источник
Оба значения можно легко различить с помощью оператора строгого сравнения:
Рабочий пример на:
http://www.thesstech.com/tryme?filename=nullandundefined
Образец кода:
источник
Если целью оператора if является проверка
null
илиundefined
значения перед присвоением значения переменной, вы можете использовать оператор Nullish Coalescing Operator , который наконец-то доступен в JavaScript, хотя поддержка браузера ограничена. По данным caniuse , поддерживается только 48,34% браузеров (по состоянию на апрель 2020 года).Это гарантирует, что переменная будет присвоена пустой строке (или любому другому значению по умолчанию), если
some_variable
естьnull
илиundefined
.Этот оператор больше всего подходит для вашего случая использования, так как он не возвращает значение по умолчанию для других типов ложных значений, таких как
0
и''
.источник
Вы должны определить функцию этой формы:
источник
В ES5 или ES6, если вам нужно проверить это несколько раз, вы делаете следующее:
источник
С Ramda вы можете просто сделать так, чтобы
R.isNil(yourValue)
Lodash и другие вспомогательные библиотеки выполняли ту же функцию.источник