Я часто вижу код JavaScript, который проверяет неопределенные параметры и т.д. таким образом:
if (typeof input !== "undefined") {
// do stuff
}
Это кажется расточительным, поскольку включает как поиск типов, так и сравнение строк, не говоря уже о его многословности. Это нужно, потому что undefined
можно было бы переименовать.
Мой вопрос:
как этот код лучше, чем этот подход:
if (null != input) {
// do stuff
}
Насколько я знаю, вы не можете переопределить null
, поэтому он не сломается неожиданно. И, из-за приведения типов !=
оператора, он проверяет и то, undefined
и другое null
... что часто именно то, что вы хотите (например, для необязательных параметров функции).
Тем не менее, эта форма не кажется широко распространенной, и она даже заставляет JSLint кричать на вас за использование !=
оператора зла .
Почему это считается плохим стилем?
источник
if (null != input)
это только «Йода говорить» для говорящего на английском языке (из одного я .... uuammmmm), так что если они приравнивают к одной и той же вещи, это на самом деле просто семантика. ИМХО.Ответы:
typeof
безопаснее, так как позволяет идентификатору никогда не быть объявленным ранее:источник
==
может быть лучше, потому что он тестирует как нулевой, так и неопределенный.!==
or===
при сравнении значения, тип которого известен как строка.Если переменная объявлена (либо с
var
ключевым словом, либо как аргумент функции, либо как глобальная переменная), я думаю, что лучший способ сделать это:JQuery делает это, так что это достаточно хорошо для меня :-)
В противном случае вам придется использовать,
typeof
чтобы избежатьReferenceError
.Если вы ожидаете, что undefined будет переопределен, вы можете обернуть ваш код следующим образом:
Или получить его через
void
оператора:источник
undefined
это имя параметра функции, а не его значение. В функцию ничего не передается, то есть значение первого параметра не определено.хороший способ:
Но лучший способ проверить это:
источник
if (typeof neverDeclared === typeof undefined) {
но Lint выдает ошибку. Msgstr "Ожидал строку и вместо этого увидел" typeof "." Как бы вы обойти эту ошибку? Должны ли мы подчиняться требованиям Линт и использовать вместо этого «хороший путь»?typeof neverDeclared === typeof void 0
;-Dif(typeof neverDeclared === typeof undefined_variable_with_a_name_assumed_to_be_never_defined) {
но это довольно долго.Вы не должны беспокоиться о переименовании неопределенного. Если кто-то переименует undefined, у вас будет гораздо больше проблем, чем с несколькими, если проверки не пройдены. Если вы действительно хотите защитить свой код, оберните его в IFFE (немедленно вызванное выражение функции), например:
Если вы работаете с глобальными переменными (что уже неправильно) в среде браузера, я бы проверил неопределенность следующим образом:
Поскольку глобальные переменные являются частью объекта окна, вы можете просто проверить неопределенность, вместо приведения к строке и сравнения строк.
Кроме того, почему ваши переменные не определены? Я видел много кода, где они проверяют существование переменных и выполняют некоторые действия, основанные на этом. Ни разу я не видел, где этот подход был правильным.
источник
Если вы действительно беспокоитесь о переопределении undefined, вы можете защитить его с помощью некоторого вспомогательного метода, подобного этому:
Это работает, потому что когда кто-то пишет,
undefined = "foo"
он только позволяет имениundefined
ссылаться на новое значение, но он не меняет фактическое значениеundefined
.источник
undefined_check
ее вверху, а затем просто использовать ее везде в своем коде.typeof
проверка.Вы также можете использовать оператор void для получения неопределенного значения:
(И да, как отмечалось в другом ответе, это приведет к ошибке, если переменная не была объявлена, но этот случай часто может быть исключен либо путем проверки кода, либо путем рефакторинга кода, например,
window.input !== void 0
для тестирования глобальных переменных или добавленияvar input
.)источник
Я действительно сталкивался, если
(typeof input !== 'undefined')
в этом сценарии он используется для предоставления параметров функции по умолчанию:ES6 предоставляет новые способы введения параметров функции по умолчанию следующим образом:
Это менее многословно и чище, чем первый вариант.
источник
источник
источник
источник
работает просто отлично. Это, конечно, не
null
сравнение, но я обычно нахожу, что если мне нужно провести различие междуundefined
иnull
, на самом деле мне скорее нужно различатьundefined
и просто любое ложное значение, поэтомуЯвляется ли.
Если программа переопределяет
undefined
это, это действительно мозговой смерть в любом случае.Единственная причина, по которой я могу придумать, заключалась в совместимости с IE4, он не понимал
undefined
ключевое слово (к сожалению, на самом деле это не ключевое слово), но, конечно, значения могли бытьundefined
, поэтому вы должны были иметь это:и сравнение выше будет работать просто отлично.
Во втором примере вам, вероятно, нужны двойные скобки, чтобы сделать ворс счастливым?
источник
input == undefined
вернетсяtrue
наnull
вход.