"Быть ​​или не быть" о переменных в 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. А переменные в объектах - это свойства, а не переменные, и обрабатываются немного иначе.