Javascript.RU

PHP-функция: isset

Пермалинк: http://javascript.ru/php/isset

Javascript:

/* 
Если переменная локальная, 
то есть была объявлена при помощи var 
тогда проверить можно так:
*/
if (variable !== undefined) {
 ...
}
/* если же переменная глобальная, то */
if (window.variable !== undefined) {
 ...
}

Примеры:

if (window.XMLHttpRequest !== undefined) { .. }


Автор: dmitlantis, дата: 19 августа, 2009 - 19:22
#permalink

Походу во всём рунете нет конструктивного ответа на этот вопрос. Все знают что проверить наличие переменной в стеке можно с помощью typeof , но как дело доходит до структурных типов: например typeof defindevar.undefinedvar === 'undefined' - всё это дело сразу улетает в эксепшен и умирает.


Автор: Shine (не зарегистрирован), дата: 29 сентября, 2009 - 13:23
#permalink
function isset () {
    // +   original by: Kevin van Zonneveld 
    // +   improved by: FremyCompany
    // +   improved by: Onno Marsman
    // *     example 1: isset( undefined, true);
    // *     returns 1: false
    // *     example 2: isset( 'Kevin van Zonneveld' );
    // *     returns 2: true
    
    var a=arguments, l=a.length, i=0;
    
    if (l===0) {
        throw new Error('Empty isset'); 
    }
    
    while (i!==l) {
        if (typeof(a[i])=='undefined' || a[i]===null) { 
            return false; 
        } else { 
            i++; 
        }
    }
    return true;
}

Автор: s4 (не зарегистрирован), дата: 21 апреля, 2010 - 16:56
#permalink

Такие проверки актуальны только если переменная обьявленна но еще не определенна. Если же переменная еще не обьявленна, то интерпритатор скрипта падает не входя в функцию.
Вот пример для проверки не обьявленных глобальных переменных.

/* isset for javascript */
window.isset = function (){
 if (arguments.length===0) return false;
 var buff=arguments[0];
 for (var i=0; i<arguments.length; i++){
  if (typeof(buff)==='undefined') return false;
  buff = buff[arguments[i+1]];
 }
 return true;
}

function test(){
 var localValue;
 console.log("window:      "+isset(window));
 console.log("globalValue: "+isset(window, "globalValue"));
 console.log("localValue:  "+isset(localValue));
 console.log("undefValue:  "+isset(window, "undefValue"));
}
var globalValue=2;
test();

Автор: Alx (не зарегистрирован), дата: 3 марта, 2011 - 15:51
#permalink

Какой смысл начинать цикл с нуля и использовать в нём только (i+1)?


Автор: Alx (не зарегистрирован), дата: 3 марта, 2011 - 15:53
#permalink

и

if (typeof(buff)==='undefined') return false;

в теле цикла ну совсем ни к чему


Автор: Гость (не зарегистрирован), дата: 10 января, 2011 - 12:58
#permalink
alert('Hello World!');

Автор: Questioner, дата: 22 марта, 2012 - 18:57
#permalink

По-моему, так проверить существование переменной невозможно. Во всяком случае, надо её хоть куда-нибудь передать для этого.


Автор: Andreyalek (не зарегистрирован), дата: 19 ноября, 2011 - 04:58
#permalink

Как альтернатива:

if (window.isset == undefined) {
    window.isset = function(val) {
        try {
            eval('window.isset.tmp='+val);
            return (window.isset.tmp != undefined && window.isset.tmp != null);
        } catch(e) {
            return false;
        }
    }

}

Только метод вызываем не
isset(defindevar.undefinedvar)
а
isset('defindevar.undefinedvar')


Автор: Nyko13 (не зарегистрирован), дата: 10 апреля, 2013 - 13:30
#permalink

пользуйтесь, сам писал, часто использую, все прекрасно работает.

function isset(e,tt,tt1){
    /**
     * created by Nyko13 (ug developer team) 10.04.2013.
     *
     * e:       element for test
     * tt,tt1:  ['string'] - check for empty string.
     *              return: if string isset but is empty - return false
     *          ['array'] - check for empty array.
     *              return: if array isset but is empty - return false
     *
     * function return: true - if isset
     *                  false - if not isset
     *                  0 - if can`t check
     *
     * usage note:
     *	for check jQuery element like $('div'), need use param 'array'.
     *	parameters after 'e' can be administered in any order (isset(e,'string'); isset(e,'array'); isset(e,'string','array'); - all this work fine)
     */
    var t = [];
    if(typeof tt != 'undefined'){
        t[t.length] = tt;
    }
    if(typeof tt1 != 'undefined'){
        t[t.length] = tt1;
    }
    var types = new Array('boolean','string','object','number');
    var type = typeof e;

    if(type != 'undefined' && e != null){
        for(var i=0;i<types.length;i++){
            if(types[i]==type){
                if(t.length>0){
                    for(var j=0;j<t.length;j++){
                        if(e.length<=0
                           && ((type == 'string' && t[j] == 'string')
                                || (type == 'object' && t[j] == 'array'))){
                            return false;
                        }
                    }
                }
                return true;
            }
        }
    }else{
        return false;
    }
    return 0;
}

Автор: Nyko13 (не зарегистрирован), дата: 10 апреля, 2013 - 15:03
#permalink

редактнул свою функцию... убрал излишний цикл, вообще если бы сюда не написал то не заметил бы )) ловите код. теперь она проверяет не только переменную а и функции и вообще все что может только быть, определенным образом, можно проверить ею если пофантазировать.

function isset(e,tt,tt1){
    /**
     * created by Nyko13 (ug developer team) 10.04.2013.
     *
     * e:       element for test
     * tt,tt1:  ['string'] - check for empty string.
     *              return: if string isset but is empty - return false
     *          ['array'] - check for empty array.
     *              return: if array isset but is empty - return false
     *
     * function return: true - if isset
     *                  false - if not isset
     *                  0 - if can`t check
     *
     * usage note:
     *	for check jQuery element like $('div'), need use param 'array'.
     *	parameters after 'e' can be administered in any order (isset(e,'string'); isset(e,'array'); isset(e,'string','array'); - all this work fine)
     */
    var t = [];
    if(typeof tt != 'undefined'){
        t[t.length] = tt;
    }
    if(typeof tt1 != 'undefined'){
        t[t.length] = tt1;
    }
    var type = typeof e;

    if(type != 'undefined' && e != null){
        if(t.length>0){
            for(var j=0;j<t.length;j++){
                if(e.length<=0
                    && ((type == 'string' && t[j] == 'string')
                    || (type == 'object' && t[j] == 'array'))){
                    return false;
                }
            }
        }
        return true;
    }else{
        return false;
    }
    return 0;
}

для тех кто бут придираться, на будущее)) , в коментах не дата создания а дата последней модификации.

а по поводу того что если у вас стоит задача проверить переменную или функцию которые могут быть вообще не обявлены, то это решаеться следующим образом (конечно используя и вышеописанную функцию):

var check;
    try{
        check = isset(test);
    }catch(e){
        check = false;
    }
    alert(check);

вообщем вот и все, пользуйтесь на здоровье!


Автор: mbaev (не зарегистрирован), дата: 12 мая, 2017 - 16:23
#permalink
function isset(base, variable) {
  var isset = false, path;
  if (typeof base !== 'undefined' && typeof variable !== 'undefined') {
    path = variable.split('.');
    if (path.length) {
      for (var i in path) {
        if (path.hasOwnProperty(i) && typeof base[path[i]] === 'undefined') {
          console.log('undefined variable: "' + path[i] + '"');
          return false;
        }
        else {
          base = base[path[i]];
        }
      }
      isset = true;
    }
  }
  return isset;
}
if (typeof var1 !== 'undefined' && typeof var1.var2 !== 'undefined' && typeof var1.var2.var3 !== 'undefined') {
  // code
}
// the same
if (isset(window, 'var1.var2.var3')) {
  // code
}

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
4 + 4 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Реклама
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum