Я наткнулся на следующий код:
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
Я немного новичок в JavaScript, но из других вопросов, которые я читал здесь, у меня сложилось впечатление, что этот код не имеет особого смысла.
Вы получите ошибку, если получите доступ к неопределенной переменной в любом контексте, кромеtypeof
.
Обновление: ответ (цитата) выше может вводить в заблуждение. Он должен сказать «необъявленная переменная» , а не «неопределенная переменная» .
Как я выяснил, в ответах на Райана ♦ , maerics и nwellnhof , даже когда в функцию не передаются аргументы, ее переменные для аргументов всегда объявляются. Этот факт также доказывает неправильность первого пункта в списке ниже.
Насколько я понимаю, могут возникнуть следующие сценарии:
Функция была вызвана без аргументов, создаваяdata
неопределенную переменную и вызывая ошибкуdata != null
.Функция была вызвана специально с
null
(илиundefined
) в качестве аргумента, и в этом случаеdata != null
уже защищает внутренний код, что делает его&& data !== undefined
бесполезным.Функция была вызвана с ненулевым аргументом, в этом случае она будет тривиально передавать
data != null
иdata !== undefined
.
Q: мое понимание верно?
Я попробовал следующее в консоли Firefox:
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
Я не могу понять случай, когда data !== undefined
после data != null
может быть какой-либо пользы.
источник
if (data)
. Это мнемонический способ Javascript, чтобы проверить,data
оценивает ли переменная значение true.undefined
,null
false, 0, пустая строка, пустой массив и (?) объект без свойств оценивается как false, остальное - true.if(data)
будет означать, что он не может передатьfalse
или в0
качестве значения дляdata
.if(typeof someUndefVar == whatever) -- works
иif(someUnderVar) -- error
.data !== null && data !== undefined
, что эквивалентно тому,data != null
что эквивалентноdata != undefined
. Первая форма имеет тенденцию быть предпочтительной, так как она более четко описывает условия, в то время как было бы легко пропустить оба этих условияnull
иundefined
проверяться с последующими двумя условиями.undefined
IMO - это запах кода. Это не защищенное ключевое словоnull
, а переменная, которая не определена. Это полностью допустимо и нарушит ваш код:undefined = 1
Ответы:
«Неопределенная переменная» отличается от значения
undefined
.Неопределенная переменная:
Переменная со значением
undefined
:Когда функция принимает аргумент, этот аргумент всегда объявляется, даже если его значение равно
undefined
, и поэтому ошибки не будет. Вы правы в том, что!= null
следует!== undefined
бесполезно.источник
data !== null && data !== undefined
будет иметь смысл, хотя.data != null
проверял бы обаnull
иundefined
(но, что интересно, только дляnull
иundefined
, а не другие ложные значения).В JavaScript
null
это специальный одноэлементный объект, который полезен для сигнализации «нет значения». Вы можете проверить это путем сравнения, и, как обычно в JavaScript, рекомендуется использовать===
оператор, чтобы избежать путаницы приведения типов:Как отмечает @rynah, «undefined» немного сбивает с толку в JavaScript. Тем не менее, всегда безопасно проверить,
typeof(x)
является ли строка «undefined», даже если «x» не является объявленной переменной:Кроме того, переменные могут иметь «неопределенное значение», если они не инициализированы:
Собрав все вместе, ваш чек должен выглядеть так:
Однако, поскольку переменная «data» всегда определяется, поскольку она является формальным параметром функции, использование оператора «typeof» не является необходимым, и вы можете безопасно сравнивать напрямую с «неопределенным значением».
Этот фрагмент означает, что "если функция была вызвана с аргументом, который определен и не является нулевым ..."
источник
!= null
будет истинным для всех значений, кромеnull
иundefined
, и мы уверены, что эта переменная объявлена.typeof
в других ситуациях это может быть даже опасно - что если вы неправильно наберете имя переменной? Это может остаться незамеченным в течение длительного времени, потому что ошибки нет.!=
, только строгое сравнение!==
,?===
), если вы действительно не знаете, что делаете и не хотите сравнивать после преобразования (==
).undefined
. Кроме того, Safari на iPad сделает это ни при каких условиях. Вы не можете дажеdelete window.undefined
.В вашем случае используйте
data==null
(что справедливо ТОЛЬКО для нулевого и неопределенного - на втором изображении фокусируйтесь на строках / столбцах с нулевым неопределенным значением)Показать фрагмент кода
Здесь у вас есть все ( SRC ):
если
== (его отрицание ! = )
=== (это отрицание ! == )
источник
Q: Функция была вызвана без аргументов, что делало данные неопределенной переменной и приводило к ошибке данных! = Null.
A: Да,
data
будет установлено неопределенное. См. Раздел 10.5. Декларация обязательности . Но доступ к неопределенному значению не вызывает ошибку. Вы, вероятно, путаете это с доступом к необъявленной переменной в строгом режиме, которая вызывает ошибку.Q: Функция была вызвана специально с нулем (или неопределенным) в качестве аргумента, и в этом случае data! = Null уже защищает внутренний код, делая && data! == undefined бесполезным.
Q: Функция была вызвана с ненулевым аргументом, и в этом случае она будет тривиально передавать как данные! = Нуль, так и данные! == undefined.
A: Верно. Обратите внимание, что следующие тесты эквивалентны:
См. Раздел 11.9.3 Алгоритм сравнения абстрактного равенства и раздел 11.9.6 Алгоритм сравнения строгого равенства спецификации.
источник
data
что не будет существовать вообще, вместо того, чтобы быть установленнымundefined
. Я ценю разъяснения, и эти ссылки помогли мне лучше понять, как работают оба равенства.Я думаю, что тестирование переменных на значения, которые вы не ожидаете, в целом не очень хорошая идея. Потому что тест как ваш можно считать записью в черный список запрещенных значений. Но что, если вы забудете перечислить все запрещенные значения? Кто-то, даже вы, может взломать ваш код с передачей неожиданного значения. Поэтому более подходящий подход - это что-то вроде белого списка - тестирование переменных только на ожидаемые значения, а не на неожиданные. Например, если вы ожидаете, что значение данных будет строкой, вместо этого:
сделать что-то вроде этого:
источник
typeof foo === "undefined"
отличаетсяfoo === undefined
, никогда не путайте их.typeof foo === "undefined"
это то, что вам действительно нужно. Кроме того, используйте!==
вместо!=
Таким образом, заявление можно записать как
Редактировать:
Вы не можете использовать
foo === undefined
для необъявленных переменных.источник
foo === undefined
опасным для использования. Это делает ваш код неработоспособным для того же состояния, которое вы пытались предотвратить.foo === undefined
вполне приемлемо в ситуации ОП (при условии, чтоundefined
оно не было переопределено). Ответ также не объясняет, почему!==
следует использовать вместо!=
.Простой способ сделать ваш тест:
источник
data
является строкой, этот тест возвращает false для пустых строк, что может или не может быть уместным (функция может захотеть иметь дело с пустой строкой каким-либо образом).""
или0
илиNaN
(или другие), блок «if» будет пропущен; что может или не может быть целью ОП.источник
null
.