"Быть или не быть" о переменных в JavaScript
Просто сделайте небольшое введение в JavaScript. Я привык к более чем частому тестированию существования моих указателей на С++, чтобы не сбой.
Никогда я не читал "Гамлет", но я читал эту страницу о null
и undefined
в JavaScript.
И в двух словах я могу:
if (varname == null)
if (varname === null)
if (typeof(varname) != 'undefined')
if (varname != undefined)
if ('varname' in object)
if (object.hasOwnProperty('varname'))
Честно говоря, это слишком много для меня:). Каков классический способ JavaScript для тестирования переменных, чтобы избежать сбоев?
Ответы
Ответ 1
Из-за ошибок, вызванных чтением необъявленных глобалов, проверка переменной лучше всего сделать, используя третий пример, пример typeof
.
if (varname == null)
сообщит вам, определено ли значение и значение nullish, и выдайте ошибку, если она не объявлена.
if (varname === null)
сообщит вам, определено ли значение и точно нулевое значение, и выдайте ошибку, если она не объявлена.
if (typeof(varname) != 'undefined')
сообщит вам, определена ли переменная или нет, не выкидывая ошибку.
if (varname != undefined)
противоположно первому.
if ('varname' in object)
сообщит вам, имеет ли объект свойство либо сам по себе, либо где-то по цепочке прототипов. Это не гарантируется для работы с объектами хоста.
if (object.hasOwnProperty('varname'))
сообщит вам, имеет ли объект собственное свойство, игнорируя цепочку прототипов.
Это сломается, если установлено свойство с именем hasOwnProperty.
if (Object.hasOwnProperty.call(object, 'varname'))
- более надежная версия последнего.
Ответ 2
обычным способом является использование правдоподобия значений.
if(varname){
}
Это охватывает большинство приведенных вами примеров.
Ответ 3
Первоначальный вопрос:. Каков классический способ JavaScript для тестирования переменных, чтобы избежать сбоев?
Это может быть классический способ, и это, безусловно, очень практичный способ:
Во-первых, вы никогда не должны иметь необъявленных переменных. Используйте JSLint, чтобы убедиться, что вы этого не делаете.
Если вы считаете, что a
является числовым, if (a != null)
сообщит вам, есть ли в нем какое-то значение (возможно, NaN), а if (a)
сообщит вам, есть ли в нем какое-то ненулевое значение.
Если вы считаете, что a
- это строка, if (a != null)
сообщит вам, есть ли в ней какое-то значение (хотя возможно пустая строка), а if (a)
сообщит вам, есть ли хотя бы один символ в строке.
Если вы считаете, что a
является объектом, if (a)
сообщит вам, если он определен. Следствие: if (a && a.prop==7)
- безопасный способ проверить значение свойства.
Если вы не знаете, что такое a
, то вы можете спокойно протестировать его с помощью if (a)
, хотя я не могу точно сказать, насколько полезны результаты.
(Опять же, если вы не представляете, что такое a
, у вас есть гораздо более серьезная проблема, чем может быть рассмотрена здесь.)
Ответ 4
Это зависит от того, что вы делаете с переменной. null
может быть или не быть вполне приемлемым значением, в зависимости от контекста (но я должен признать, что я никогда не пользовался хорошим использованием для null
в javascript). Вероятно, самое безопасное - полагаться на исключения, чтобы ловить проблемы, когда что-то пошло не так, вместо того, чтобы пытаться предвидеть ошибки, проверяя наличие переменных.
С другой стороны, если вы сравниваете что-то с null
или undefined
, рекомендуется использовать оператор ===
, который не требует принуждения типа.
Простая проверка if(variable)
будет проверять, что variable
не является ложным (то есть не null
, undefined
, false
, 0
, NaN
, -0
) или пустая строка).
Наконец, метод hasOwnProperty
часто полезен, когда вы хотите перебрать свойства объекта и исключить свойства, которые унаследованы от прототипа.
ИЗМЕНИТЬ Обратите внимание, что приведенное выше относится к переменным undefined, то есть к переменным, объявленным как
var variable;
но не назначены никакие значения или отсутствуют параметры в функциях. Можно также рассмотреть случай обращения с переменными, которые вообще не объявлены. В этом случае все тесты, такие как
if(variable);
if(variable === null);
и т.д. не удастся, сообщая об ошибке. Единственный безопасный способ, который я знаю для решения этого дела, - проверить тип переменной. То есть оператор typeof
может мягко обрабатывать переменные, которые не существуют.
if(typeof variable === 'undefined')
будет истинным, если либо
-
variable
был объявлен, но есть undefined или
-
variable
не был объявлен вообще.
Ни в коем случае эта последняя проверка не приведет к ошибке.
Ответ 5
Первое, что вам нужно понять, - это строгое равенство против правды или ложности. Строгий использует три символа равенства, где, когда истинность использует 2.
Все они эквивалентны:
var a = false;
if(!a)
if(a == false)
if(a != true)
if(a == 0)
if(a == "")
Использование трех знаков строго. False означает false, а не "falsey":
var a = false;
if(a === false)
if(a !== true)
if(a !== anything_else)
id(a === 0) // this will be false
Далее, существует небольшое различие между нулем и undefined. Null означает объявленный, но аннулированный (буквально установлен на "null" ), undefined означает объявленный, но не установленный:
window.a;
console.log(a); // undefined
window.a = null;
console.log(a); // null
Наконец, вы бы не использовали typeof для true или false. Это больше для типа string или object type. А переменные в объектах - это свойства, а не переменные, и обрабатываются немного иначе.