JavaScript isset () эквивалент - PullRequest
510 голосов
/ 17 февраля 2010

В PHP вы можете сделать if(isset($array['foo'])) { ... }.В JavaScript вы часто используете if(array.foo) { ... }, чтобы сделать то же самое, но это не совсем то же самое утверждение.Условие также оценивается как ложное, если array.foo действительно существует, но имеет значение false или 0 (и, возможно, другие значения).

Что является идеальным эквивалентом PHP isset в JavaScript?

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

Ответы [ 19 ]

4 голосов
/ 19 февраля 2016

Это довольно пуленепробиваемое решение для тестирования, если переменная существует:

var setOrNot = typeof variable !== typeof undefined ? true : false;

К сожалению, вы не можете просто заключить его в функцию.

Вы можете подумать о том, чтобы сделать что-то вроде этого:

function isset(variable) {
    return typeof variable !== typeof undefined ? true : false;
}

Однако это приведет к ошибке ссылки, если переменная variable не была определена, поскольку вы не можете передать несуществующую переменную в функцию:

Uncaught ReferenceError: foo не определено

С другой стороны, он позволяет вам проверить, не определены ли параметры функции:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

Даже если никакое значение для y не передается функции test, наша функция isset прекрасно работает в этом контексте, поскольку y известна в функции test как значение undefined.

3 голосов
/ 02 ноября 2017
(typeof SOMETHING) !== 'undefined'

Слишком долго писать при использовании. Но мы не можем упаковать ключевое слово typeof в функцию, потому что перед вызовом функции возникнет ошибка, например:

function isdef($var) {
    return (typeof $var) !== 'undefined';
}

isdef(SOMETHING); ///// thrown error: SOMETHING is not defined

Итак, я нашел способ:

function isdef($type) {
    return $type !== 'undefined';
}

isdef(typeof SOMETHING);

Может работать как с отдельными переменными (переменными, которых вообще не существует), так и со свойствами объекта (несуществующими свойствами). И всего на 7 символов больше, чем в PHP isset.

3 голосов
/ 08 декабря 2016
window.isset = function(v_var) {
    if(typeof(v_var) == 'number'){ if(isNaN(v_var)){ return false; }}
    if(typeof(v_var) == 'undefined' || v_var === null){ return false;   } else { return true; }
};

плюс тесты:

https://gist.github.com/daylik/24acc318b6abdcdd63b46607513ae073

2 голосов
/ 18 ноября 2014

Укажите путь к объекту в виде строки, затем вы можете разбить эту строку на путь и разрешить hasOwnProperty на каждом шаге, перезаписывая сам объект при каждой итерации.

Если вы кодируете в среде ES6, взгляните на этот стекопоток. Ques .

var a;

a = {
    b: {
        c: 'e'
    }
};

function isset (obj, path) {
    var stone;

    path = path || '';

    if (path.indexOf('[') !== -1) {
        throw new Error('Unsupported object path notation.');
    }

    
    path = path.split('.');
    
    do {
        if (obj === undefined) {
            return false;
        }

        stone = path.shift();
        
        if (!obj.hasOwnProperty(stone)) {
            return false;
        }
        
        obj = obj[stone];
        
    } while (path.length);

    return true;
}

console.log(
    isset(a, 'b') == true,
    isset(a, 'b.c') == true,
    isset(a, 'b.c.d') == false,
    isset(a, 'b.c.d.e') == false,
    isset(a, 'b.c.d.e.f') == false
);
2 голосов
/ 06 июня 2017

Чтобы проверить, существует ли HTML-блок или нет, я использую этот код:

if (typeof($('selector').html()) != 'undefined') {
    // $('selector') is existing
    // your code here
}
0 голосов
/ 04 июля 2019

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

//Object on which we want to test
var foo = {
    bar: {
        bik: {
            baz: 'Hello world'
        }
    }
};


/*
USE: To get value from the object using it properties supplied (Deeper),
    if found it will return the property value if not found then will return false

You can use this function in two ways
WAY - 1:
Passing an object as parameter 1 and array of the properties as parameter 2
EG: getValueFromObject(foo, ['bar', 'bik', 'baz']);
WAY - 2: (This will work only if, your object available in window object)
Passing an STRING as parameter 1(Just similarly how we retrieve value form object using it's properties - difference is only the quote)
EG: getValueFromObject('foo.bar.bik.baz');
*/
function getValueFromObject(object, properties) {
    if(typeof(object) == 'string') {            //Here we extract our object and it's properties from the string
        properties = object.split('.');
        object = window[properties[0]];
        if(typeof(object) == 'undefined') {
            return false;
        }
        properties.shift();
    }
    var property = properties[0];
    properties.shift();
    if(object != null && typeof(object[property]) != 'undefined') {
        if(typeof(object[property]) == 'object') {
            if(properties.length != 0) {
                return getValueFromObject(object[property], properties);    //Recursive call to the function
            } else {
                return object[property];
            }
        } else {
            return object[property];
        }
    } else {
        return false;
    }
}
console.log(getValueFromObject('fooo.bar.bik.baz'));        //false
console.log(getValueFromObject('foo.bar.bik.baz'));         //Hello world
console.log(getValueFromObject('foo'));                     //false
console.log(getValueFromObject('foo.bar.bik'));             //returns an object { baz: 'Hello World' }
console.log(getValueFromObject(foo, ['bar', 'bik']));       //returns an object { baz: 'Hello World' }
console.log(getValueFromObject(foo, ['bar', 'bik', 'baz']));//Hello world
0 голосов
/ 28 мая 2019

Я использую функцию, которая может проверять переменные и объекты. очень удобно работать с jQuery

    function _isset (variable) {
        if(typeof(variable) == "undefined" || variable == null)
            return false;
        else
            if(typeof(variable) == "object" && !variable.length) 
                return false;
            else
                return true;
    };
0 голосов
/ 26 октября 2017

Руководство PHP говорит:

isset - определить, установлена ​​ли переменная и не равна ли NULL

И интерфейс примерно такой:

bool isset ( mixed $var [, mixed $... ] )

Параметр $var - это проверяемая переменная. хотя он может иметь любое количество параметров.

isset () возвращает TRUE, если переменная существует и имеет значение, отличное от NULL. FALSE в противном случае.

Пример:

$foo = 'bar';
var_dump(isset($foo));        -> true

$baz = null;
var_dump(isset($baz));        -> false

var_dump(isset($undefined));  -> false

Учитывая это, по-видимому, невозможно написать точный эквивалент функции php isset(). Например, когда мы звоним так:

if (isset(some_var)) {

}

function issset() {
    // function definition
}

Javascript триггер Uncaught ReferenceError: some_var is not defined at (file_name):line_number. Важным и примечательным в этом поведении является то, что при попытке передать несуществующие переменные нормальным функциям возникает ошибка.

Но в PHP isset() на самом деле не обычные функции, а языковые конструкции. Это означает, что они являются частью самого языка PHP, не играют по обычным правилам функций и, следовательно, могут избегать появления ошибки для несуществующих переменных. Это важно при попытке выяснить, существует ли переменная или нет. Но в javscript он в первую очередь вызывает ошибку, скажем, вызов функции с несуществующими переменными.

Я хочу сказать, что мы не можем написать это как эквивалентную функцию javscript, но мы можем сделать что-то вроде этого

if (typeof some_var !== 'undefined') {
   // your code here
}

Если вы хотите точно такой же эффект, PHP также проверьте, что varable не NULL

Например

$baz = null;
var_dump(isset($baz));        -> false

Итак, мы можем включить это в javascript, тогда это будет выглядеть так:

if (typeof some_var !== 'undefined' && some_var !== null) {
   // your code here
}
0 голосов
/ 14 августа 2017
if (var) {
  // This is the most concise equivalent of Php's isset().
} 
...