Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > JavaScript, DOM/DHTML > Проверка существования переменной


Автор: Jin X 05.05.15, 10:25
Делаю так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function myFunc(x);
    {
      if (x) var y = document.getElementById(x);
      . . .
      if (y) y.innerHTML = 'бла-бла-бла';
    }
Грамотно ли так проверять существование переменной y (несмотря на то, что этот код работает)?

Добавлено
И заодно сюда же вопрос: как узнать, существует ли элемент с именем x ?

Добавлено
Вот ещё один вариант:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function myFunc(x);
    {
      var y = document.getElementById(x);
      . . .
      if (y) y.innerHTML = 'бла-бла-бла';
    }


Добавлено
Т.е. в первом случае проверяется значение x (если оно НЕпустое, то переменная y создаётся и далее идёт присвоение innerHTML).
Во втором случае y проверяется элемент x; если он существует, то идёт присвоение innerHTML.

Автор: Serafim 05.05.15, 12:08
Цитата Jin X @
Грамотно ли так проверять существование переменной y

И да и нет. Код будет работать, но в случае y = 0, y = null, y = [] - работать не будет.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if (y !== undefined) { ... }


Добавлено
Ой, не заметил, что y - это DOM объект. Тогда всё ок =)

Автор: Jin X 05.05.15, 13:07
Погоди.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      var y = document.getElementById('blabla');
      alert(y);
выдаёт null, при этом всё работает...

Добавлено
И вот так тоже срабатывает:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      var y = document.getElementById('blabla');
      if (y == null) alert('null');
=== тоже :)

Автор: Serafim 05.05.15, 13:29
Цитата Jin X @
выдаёт null, при этом всё работает...

потому что переменная существует, но содержит null. Еслиб не существовала (вопрос же твой, цитата: "Грамотно ли так проверять существование переменной") - был бы андефайн.

Автор: Jin X 06.05.15, 15:36
Так, ты же говоришь:
Цитата Serafim @
в случае y = 0, y = null, y = [] - работать не будет.

Автор: Serafim 06.05.15, 15:40
Ну так y у нас DOM-объект, а null отрицательное значение, т.е. которое и следует игнорировать. ;)

Добавлено
Не будет работать в случаях:

1) var a = false || null; (т.е. ожидаешь либо false, либо null)
2) var a = false || [];
3) var a = false || 0;
4) var a = false || '';

В этих случаях проверка через if(a) ожидая, что она будет успешной только при a = false - ошибочна.

Автор: Jin X 06.05.15, 18:05
Ок, а в первом случае, когда:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function myFunc(x);
    {
      if (x) var y = document.getElementById(x);
      . . .
      if (y) y.innerHTML = 'бла-бла-бла';
    }
Проверка if (y) корректна? Ведь, если if (x) не выполнится, переменная y не создастся.

Добавлено
У меня, например, конструкция:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if (y !== undefined) alert('ok!'); else alert('undefined!');
вообще не работает, если y не определено!
Uncaught ReferenceError: y is not defined

Вот так, может?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if (typeof y != 'undefined') alert('ok!'); else alert('undefined!');

Автор: Serafim 06.05.15, 21:04
Цитата Jin X @
Проверка if (y) корректна?

Цитата Serafim @
Ой, не заметил, что y - это DOM объект. Тогда всё ок =)


Добавлено
Цитата Jin X @
Вот так, может?

точно :yes: сглупил я.

CoffeScript предлагает такой же вариант

Автор: fatalist 07.05.15, 03:47
Помнится Дядя Боб меня научил:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if (typeof(element) != 'undefined')
       //exists


Добавлено
Цитата Jin X @
Вот так, может?
а, ну вот оно :)

Автор: Jin X 07.05.15, 09:44
Цитата Serafim @
Цитата Jin X @
Проверка if (y) корректна?
Цитата Serafim @
Ой, не заметил, что y - это DOM объект. Тогда всё ок =)

y - это DOM-объект только при выполнении условия if (x). А вот при НЕвыполнении y будет undefined!
Uncaught ReferenceError: y is not defined

Автор: Serafim 07.05.15, 10:23
ты же сам сказал, что null, а не undefined :wacko:
Цитата Jin X @
выдаёт null, при этом всё работает...


Добавлено
Короче, проверять наличие всегда стоит так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    typeof some !== "undefined" && some !== null


Обычно в любых вопросах по "микроалгоритмам" JS я обращаюсь к кофейной реализации, там много всяких приёмчиков, которые упрощают жизнь, в том числе и данный случай с проверкой: http://coffeescript.org/#try:some%20%3D%20...7Bsome%3F%7D%22

Автор: Jin X 07.05.15, 20:51
Цитата Serafim @
ты же сам сказал, что null, а не undefined
ты видишь, что там 2 разных примера?
в первом будет undefined, во втором ( var y = document.getElementById(x); ) = null, если элемента с именем x не сущестует.

Автор: Serafim 07.05.15, 21:04
Цитата Jin X @
ты видишь, что там 2 разных примера?

Не обратил внимание, что там другая переменная :whistle:

Добавлено
Если аргумент не задан, то очевидно undefined, что, учитывая замечание fatalist - проверяется с помощью typeof x !== 'undefined' && x !== null. y возвращает либо DOM, либо null, что проверяется либо точно так же, либо как ты написал

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)