Все зависит от того, насколько конкретно вы хотите быть / насколько вы хотите утверждать перед вызовом функции.
if (myObject)
Может ли объект или функция когда-либо провалиться в этом простом тесте?
Нет, единственными значениями, которые не проходят предложение if
, являются false
, 0
, ""
, NaN
, undefined
и null
.Это все примитивы.Объекты (включая функции) будут всегда проходить предложение if
.
if (myObject != undefined)
Когда это лучше, чем в предыдущем тесте?
Если вы хотите проверить, является ли значение «значимым», т.е. не undefined
или null
.Например,
if(numberInputtedByUser) {
// do something with inputted number
}
не выполнит условие if
, если число равно 0
, в то время как вы, вероятно, хотите, чтобы 0
было разрешено.В таком случае, != undefined
- это чуть лучше.
if (typeof(myObject) == 'object')
Это, кажется, оригинальный способ вызова типа, но некоторые люди говорят, что typeof является ключевым словом ине функция.Кроме того, почему бы не один из более простых тестов?
Это ключевое слово.Вы можете назвать это по-функциональному, хотя.В самом простом виде вы можете использовать typeof
, например:
typeof myObject
Вы можете, однако, добавить (посторонние) парены, поскольку они ничего не значат:
typeof (myObject)
Точно так же, как вы можете сделать:
(myObject).key
или даже:
(((myObject))).key
И затем вы можете удалить пробел после typeof
, если хотите, в результате чего получится что-то, что выглядит как вызов функции.
Относительно того, почему использовать typeof
- вы можете быть еще более уверены в типе переменной.С тестом if(...)
значения, которые можно передать, могут быть самыми разными - в основном все, кроме списка, который я опубликовал выше.С if(... != undefined)
вы позволяете передавать еще больше.С if(typeof ... == 'object')
вы действительно разрешаете только объекты, которые могут быть необходимы в зависимости от того, что вы обрабатываете.
if ( typeof myObject.function !== undefined ) {
В одном сообщении всегда говорилось об использовании === или! ==как он различает нуль и неопределенный.Это когда-либо важно на практике?
===
действительно предпочтительнее, чем ==
.Хотя различать null
и undefined
не всегда необходимо, очень полезно уберечь себя от таких причуд, как 0 == ''
.Если вы хотите проверить, является ли число 0
, тогда стоит использовать === 0
, поскольку == 0
также допускает пустую строку (чего вы можете не ожидать и, вероятно, не хотите).Даже в случаях, когда ==
не приводит к причудам, было бы лучше постоянно использовать ===
для согласованности и избегать неожиданных ошибок.
try {
node.addEventListener(...)
}
catch(err) {
node.attachEvent(...)
}
Это, конечно, возможно и очень просто.Обратите внимание, что try catch
называется медленным.Более того, вы на самом деле не объясняете, почему это не удается.Это немного упрощенно (но может работать нормально).
if (typeof node.addEventListener == "function")
, но это когда-нибудь даст результат, отличный от простого
if (node.addEventListener)
Да, как я сказал выше, первый только передает функции, в то время как второй разрешает все, кроме этого списка «ложных» значений.Можно добавить Node.addEventListener = 123
, и он пропустит предложение if
во втором случае. Но IE не может дать правильный typeof
результат:
typeof alert !== "function"
Бьюсь об заклад, то же самое относится и к addEventListener
, поэтому вы все равно будете избегать этой функции, даже если она существует.
В конце я бы просто использовал простое предложение if
.Конечно, это не удастся, если вы добавите странные вещи, такие как Node.addEventListener = 123
, но с другой стороны вы наверняка будете ожидать странных вещей.