Jump to content
  • 0

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


AND
 Share

Question

Recommended Posts

  • 0

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

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

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

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

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

Link to comment
Share on other sites

  • 0
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
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
Бить по рукам таких программистов...

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

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

Вот что на этот счет говорит 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
4.3.9 Undefined Value

...

4.3.10 Undefined Type

...

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

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 (поэтому и возникли ассоциации с ключевыми словами).

А проверка на функцию делается через тот же 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
Все это конечно интересно, а как проверить существование массива, имя которого собирается в процессе выполнения? Объсняю.

Есть 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
Используйте try catch и будет вам счастье.

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

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

×
×
  • 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