«Быть ​​или не быть» о переменных в JavaScript - PullRequest
10 голосов
/ 24 февраля 2011

Просто делаю небольшое введение в JavaScript.Я привык чаще, чем часто проверять наличие моих указателей в C ++, чтобы не вылетать.

Я никогда не читал Гамлета, но я читал эту страницу о 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 для тестирования переменных, чтобы избежать сбоев?

Ответы [ 5 ]

12 голосов
/ 24 февраля 2011

Из-за ошибок, возникающих при чтении необъявленных глобальных переменных, лучше всего проверить переменную, используя третий пример, пример typeof.

if (varname == null)

сообщит вам, определено ли значение и имеет ли оно нулевое значение, и выдаст ошибку, если оно не объявлено.

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'))

- более надежная версия последней.

3 голосов
/ 24 февраля 2011

обычным способом является использование достоверности значений.

if(varname){

}

Это охватывает большинство примеров, которые вы дали

2 голосов
/ 24 февраля 2011

Первоначальный вопрос был следующим: : Каков классический способ 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, у вас гораздо большая проблема, чем здесь можно решить).

1 голос
/ 24 февраля 2011

Первое, что вам нужно понять, это строгое равенство против правдивости или ложности. Строгий использует три знака равенства, где в качестве правдивости используется 2.

Все они эквивалентны:

var a = false;
if(!a)
if(a == false)
if(a != true)
if(a == 0)
if(a == "")

Использование трех знаков строго. Ложь означает ложь, а не «ложь»:

var a = false;
if(a === false)
if(a !== true)
if(a !== anything_else)
id(a === 0) // this will be false

Далее, есть небольшая разница между нулевым и неопределенным. Нуль означает объявленный, но обнуленный (буквально установленный на «ноль»), неопределенный означает объявленный, но не установленный:

window.a;
console.log(a); // undefined

window.a = null;
console.log(a); // null

Наконец, вы бы не использовали typeof для true или false. Это больше для строки или типа объекта. А переменные внутри объектов - это свойства, а не переменные, и они обрабатываются немного иначе.

1 голос
/ 24 февраля 2011

Это зависит от того, что вы должны делать с переменной. null может быть или не быть вполне приемлемым значением, в зависимости от контекста (но я должен признать, что я никогда не думал о хорошем использовании null в javascript). Вероятно, самым безопасным является использование исключений для выявления проблем, когда что-то идет не так, вместо того, чтобы пытаться предвидеть ошибки, проверяя наличие переменных.

С другой стороны, если вы сравниваете что-то с null или undefined, рекомендуется использовать оператор ===, который не требует приведения типов.

Более простая проверка if(variable) проверит, что variable не является ложным (то есть, это не null, undefined, false, 0, NaN, -0 или пустая строка).

Наконец, метод hasOwnProperty часто полезен, когда вы хотите зациклить свойства объекта и исключить свойства, унаследованные от прототипа.

РЕДАКТИРОВАТЬ Обратите внимание, что вышесказанное относится к неопределенным переменным, то есть переменным, которые объявлены как

var variable;

, но им не присвоены какие-либо значения или отсутствуют параметры в функциях. Можно также рассмотреть случай обращения с переменными, которые вообще не объявлены. В этом случае все тесты типа

if(variable);
if(variable === null);

и т. Д. Потерпит неудачу, сообщив об ошибке. Единственный безопасный способ справиться с этим делом - это проверить тип переменной. То есть оператор typeof может аккуратно обрабатывать переменные, которые не существуют.

if(typeof variable === 'undefined')

будет истинным, если либо

  • variable было объявлено, но не определено, или
  • variable не был объявлен вообще.

Ни в коем случае эта последняя проверка не вызовет ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...