Jump to content
  • 0

Как проверить существование переменной?


AND
 Share

Question

Recommended Posts

  • 0

Девятилап, вопрос про Javascript, а не php.

  AND said:
:)Как проверить существование переменной?

Только сразу камнями не забрасывайте :)

Проверить можно так:

var foo;
if(foo === undefined) {
alert("Переменная foo неопределена");
}
else {
alert("Переменная foo определена");
}

Link to comment
Share on other sites

  • 0
  yopopt said:
var foo;
if(foo === undefined) {
alert("Переменная foo неопределена");
}
else {
alert("Переменная foo определена");
}

Секундочку? Разве не так?

var foo;
if(typeof foo == 'undefined') {
alert("Переменная foo неопределена");
}
else {
alert("Переменная foo определена");
}

Link to comment
Share on other sites

  • 0
  yopopt said:
homm, чем typeof лучше строгого сравнения?

1) typeof работает даже для непродикларированных переменных.

2)

<script>
var foo;
var undefined = 'bar';
if(foo === undefined) {
alert("Переменная foo неопределена");
}
else {
alert("Переменная foo определена");
}
</script>

Link to comment
Share on other sites

  • 0
  homm said:
  yopopt said:
Бить по рукам таких программистов...

Проще тех, что так проверяет существование переменных :)

Проще, но не лучше. :) Все переменные должны быть инициализированны и не должны пересекаться с ключевыми словами. Тогда таких проблем не возникнет.

Link to comment
Share on other sites

  • 0
  homm said:
С каих пор ?undefined? ? ключевое слово?

Просто признай что твой метод ни на что не годится, а мой работает всегда верно и закончим на этом.

Ну-ну. Заметь, я не утверждал, что "undefined" - ключевое слово. :)

Я признаю, что твой метод более универсален и, потому, верен, а мой "ни на что не годится", однако согласись, что называть переменные подобным образом как минимум глупо.

Link to comment
Share on other sites

  • 0
  yopopt said:
однако согласись, что называть переменные подобным образом как минимум глупо.

Согласен, но ведь речь же не о том. Еще более нетривиальная задача ? узнать является ли выражение функцией.

Вот что на этот счет говорит jQuery:

isFunction: function( fn ) {
return !!fn && typeof fn != "string" && !fn.nodeName &&
fn.constructor != Array && /function/i.test( fn + "" );
}

И даже с такими заморочками на rsdn нашли ошибку в этой функции, кажется она неверно срабатывает для регулярных выражений, содержащих слово ?function? или что-то вроде того :)

Link to comment
Share on other sites

  • 0
  WingedFox said:
  "ECMA-262" said:
4.3.9 Undefined Value

...

4.3.10 Undefined Type

...

Спор на тему "undefined ? это (не)ключевое слово" мало чего общего имеет с разделами 4.3.9/4.3.10. В данном случае надо обращаться к разделу:

  Quote
15.1.1 Value Properties of the Global Object

...

15.1.1.3 undefined

The initial value of undefined is undefined (section 8.1). This property has the attributes { DontEnum,

DontDelete}.

Т.е. пример yopopt if(foo === undefined) имеет дело именно с глобальным св-вом undefined (поэтому и возникли ассоциации с ключевыми словами).

  WingedFox said:
А проверка на функцию делается через тот же typeof.

Даже в случае с native ECMAScript objects, например в SpiderMonkey, можно получить неожданный результат:

typeof new RegExp == 'function' // => true

Вроде функция, а вроде кое-чего для того, чтобы быть функцией, не хватает (хотя вызвать-то как-раз можно).

А если дело дойдет до host objects, то тогда вообще никакой typeof не поможет:

typeof document.images == 'function' // => true (some ver. of Konqueror, Safari, Shiira, Opera etc)
typeof document.getElementById == 'object' // => true (IE)

Link to comment
Share on other sites

  • 0

Все это конечно интересно, а как проверить существование массива, имя которого собирается в процессе выполнения? Объсняю.

Есть php-код, который генерирует создание переменных-массивов в javascript (по определенному правилу). Т.е. например arr_1, arr_4 и подобные. В ходе выполнения javascript-а, нужно определить, существует ли переменная массива и выполнить определенный код.

var objSel = "arr_"+send_obj.value;
if (typeof eval(objSel) != "undefined") {
alert("есть")
} else {
alert("нет")
}

Если массив существует, проблем нет, проверка работает. А вот если такого массива не существует, т.е. он даже не задекларирован, ошибка прерывает все.

Основная проблема здесь как я понял, в использовании eval, но имя переменной неизвестно до запуска скрипта, и индексы элементов этого массива также неизвестны заранее. Мучаюсь уже который день, и из-за одной маленькой проблемы стоит разработка.

Link to comment
Share on other sites

  • 0
  cerber_ said:
Все это конечно интересно, а как проверить существование массива, имя которого собирается в процессе выполнения? Объсняю.

Есть php-код, который генерирует создание переменных-массивов в javascript (по определенному правилу). Т.е. например arr_1, arr_4 и подобные. В ходе выполнения javascript-а, нужно определить, существует ли переменная массива и выполнить определенный код.

var objSel = "arr_"+send_obj.value;
if (typeof eval(objSel) != "undefined") {
alert("есть")
} else {
alert("нет")
}

Если массив существует, проблем нет, проверка работает. А вот если такого массива не существует, т.е. он даже не задекларирован, ошибка прерывает все.

Основная проблема здесь как я понял, в использовании eval, но имя переменной неизвестно до запуска скрипта, и индексы элементов этого массива также неизвестны заранее. Мучаюсь уже который день, и из-за одной маленькой проблемы стоит разработка.

Используйте try catch и будет вам счастье.

Link to comment
Share on other sites

  • 0
  s0rr0w said:
Используйте try catch и будет вам счастье.

А слона-то я и не заметил. Спасибо )

  homm said:
Сделайте arr массивом и обращайтесь к нему arr[4]

Многомерный массив тоже идея, но кода больше и сложнее чем try.

Link to comment
Share on other sites

  • 0
  cerber_ said:
А слона-то я и не заметил. Спасибо )

Многомерный массив тоже идея, но кода больше и сложнее чем try.

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

Link to comment
Share on other sites

  • 0
  s0rr0w said:
Я лично вообще не понимаю зачем нужно проверять переменную на то, определена она или нет. Если алгоритм требует такой проверки, то это неправильный какой-то алгоритм...

Возможно, когда скрипт созданный разработчиком конфигурируется глобальными переменными, изменяемыми конечным пользователем. Т.е., например, если переменная не задана, будет использовано значение по умолчанию.

Link to comment
Share on other sites

  • 0
  Tokolist said:
Возможно, когда скрипт созданный разработчиком конфигурируется глобальными переменными, изменяемыми конечным пользователем. Т.е., например, если переменная не задана, будет использовано значение по умолчанию.

А конкретный пример, более жизненный можно?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Обсуждения

    • Актуальные контакты: Telegram: @Nikker_web E-Mail:   tarasevich.email@gmail.com Портфолио https://www.behance.net/d4d4186e Разрабатываю дизайн групп в соц сетях, сайтов, приложений, другой дизайн под заказ    
    • Актуальные контакты: Telegram: @Nikker_web E-Mail:   tarasevich.email@gmail.com   Разрабатываю дизайн групп в соц сетях, сайтов, приложений, другой дизайн под заказ   Портфолио https://www.behance.net/d4d4186e
    • Доброго всем времени суток. Прошу помощи. Научите принципу изменения футера. Движок Xenforo. Версия 2.2.10. Стиль дефолтный. Что именно нужно в итоге на фото примере. Мой шаблон app.footer less имеет следующее значение.  .p-footer { .xf-publicFooter(); a { .xf-publicFooterLink(); } } .p-footer-inner { .m-pageWidth(); .m-pageInset(); padding-top: @xf-paddingMedium; padding-bottom: @xf-paddingLarge; } .p-footer-row { .m-clearFix(); margin-bottom: -@xf-paddingLarge; } .p-footer-row-main { float: left; margin-bottom: @xf-paddingLarge; } .p-footer-row-opposite { float: right; margin-bottom: @xf-paddingLarge; } .p-footer-linkList { .m-listPlain(); .m-clearFix(); > li { float: left; margin-right: .5em; &:last-child { margin-right: 0; } a { padding: 2px 4px; border-radius: @xf-borderRadiusSmall; &:hover { text-decoration: none; background-color: fade(@xf-publicFooterLink--color, 10%); } } } } .p-footer-rssLink { > span { position: relative; top: -1px; display: inline-block; width: 1.44em; height: 1.44em; line-height: 1.44em; text-align: center; font-size: .8em; background-color: #4682B4; border-radius: 2px; } .fa-rss { color: white; } } .p-footer-copyright { margin-top: @xf-elementSpacer; text-align: center; font-size: @xf-fontSizeSmallest; } .p-footer-debug { margin-top: @xf-paddingLarge; text-align: right; font-size: @xf-fontSizeSmallest; .pairs > dt { color: inherit; } } @media (max-width: @xf-responsiveMedium) { .p-footer-row-main, .p-footer-row-opposite { float: none; } .p-footer-copyright { text-align: left; padding: 0 4px; // aligns with other links } }  
    • Нужны сайты с примерами верстки, типа https://css-tricks.com/. Типовые приемы и нестандартные на все случаи жизни. Накидайте ссылок.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy