JavaScript isset() эквивалент

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

Каков идеальный эквивалент PHP isset в JavaScript?

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

Ответ 1

Обычно я использую оператор typeof:

if (typeof obj.foo !== 'undefined') {
  // your code here
}

Он вернет "undefined" либо если свойство не существует, либо его значение равно undefined.

(См. также: Разница между undefined и не определена.)

Существуют и другие способы выяснить, существует ли свойство для объекта, например метод hasOwnProperty:

if (obj.hasOwnProperty('foo')) {
  // your code here
}

И оператор in:

if ('foo' in obj) {
  // your code here
}

Разница между двумя последними состоит в том, что метод hasOwnProperty проверяет, физически ли свойство существует на объекте (свойство не наследуется).

Оператор in проверяет все свойства, достигаемые в цепочке прототипов, например:

var obj = { foo: 'bar'};

obj.hasOwnProperty('foo'); // true
obj.hasOwnProperty('toString'); // false
'toString' in obj; // true

Как вы можете видеть, hasOwnProperty возвращает false, а оператор in возвращает true при проверке метода toString, этот метод определен в цепочке прототипов, потому что obj наследует форму Object.prototype.

Ответ 2

Возраст старого потока, но вот новый способ запуска эквивалентного isset().

Ответ

См. ниже пояснения. Примечание. Я использую синтаксис StandardJS

Пример использования

// IMPORTANT pass a function to our isset() that returns the value we're
// trying to test(ES6 arrow function)
isset(() => some) // false

// Defining objects
let some = { nested: { value: 'hello' } }

// More tests that never throw an error
isset(() => some) // true
isset(() => some.nested) // true
isset(() => some.nested.value) // true
isset(() => some.nested.deeper.value) // false

// Less compact but still viable except when trying to use `this` context
isset(function () { return some.nested.deeper.value }) // false

Функция ответа

/**
 * Checks to see if a value is set.
 *
 * @param {Function} accessor Function that returns our value
 */
function isset (accessor) {
  try {
    // Note we're seeing if the returned value of our function is not
    // undefined
    return typeof accessor() !== 'undefined'
  } catch (e) {
    // And we're able to catch the Error it would normally throw for
    // referencing a property of undefined
    return false
  }
}

Объяснение

PHP

Обратите внимание, что в PHP вы можете ссылаться на любую переменную на любой глубине - даже при попытке доступ к не-массиву в виде массива возвращает простой true или false:

// Referencing an undeclared variable
isset($some); // false

$some = 'hello';

// Declared but has no depth(not an array)
isset($some); // true
isset($some['nested']); // false

$some = ['nested' => 'hello'];

// Declared as an array but not with the depth we're testing for
isset($some['nested']); // true
isset($some['nested']['deeper']); // false

JS

В JavaScript у нас нет такой свободы, мы всегда будем получать ошибку, если мы это сделаем то же самое, поскольку JS немедленно пытается получить доступ к значению deeper прежде чем мы можем обернуть его в нашу функцию isset(), чтобы...

// Common pitfall answer(ES6 arrow function)
const isset = (ref) => typeof ref !== 'undefined'

// Same as above
function isset (ref) { return typeof ref !== 'undefined' }

// Referencing an undeclared variable will throw an error, so no luck here
isset(some) // Error: some is not defined

// Defining a simple object with no properties - so we aren't defining
// the property `nested`
let some = {}

// Simple checking if we have a declared variable
isset(some) // true

// Now trying to see if we have a top level property, still valid
isset(some.nested) // false

// But here is where things fall apart: trying to access a deep property
// of a complex object; it will throw an error
isset(some.nested.deeper) // Error: Cannot read property 'deeper' of undefined
//         ^^^^^^ undefined

Больше неудачных альтернатив:

// Any way we attempt to access the `deeper` property of `nested` will
// throw an error
some.nested.deeper.hasOwnProperty('value') // Error
//   ^^^^^^ undefined

Object.hasOwnProperty('value', some.nested.deeper) // Error
//                                  ^^^^^^ undefined

// Same goes for typeof
typeof some.nested.deeper !== 'undefined' // Error
//          ^^^^^^ undefined

И некоторые рабочие альтернативы, которые могут получить избыточную скорость:

// Wrap everything in try...catch
try { isset(some.nested.deeper) } catch (e) {}
try { typeof some.nested.deeper !== 'undefined' } catch (e) {}

// Or by chaining all of the isset which can get long
isset(some) && isset(some.nested) && isset(some.nested.deeper) // false
//                        ^^^^^^ returns false so the next isset() is never run

Заключение

Все остальные ответы - хотя большинство из них жизнеспособны...

  • Предположим, вы проверяете, не является ли переменная undefined, которая отлично подходит для некоторых случаев использования, но все равно может вызвать ошибку.
  • Предположим, вы только пытаетесь получить доступ к свойству верхнего уровня, что снова штраф для некоторых случаев использования
  • Заставляет вас использовать менее идеальный подход относительно PHP isset()
    например isset(some, 'nested.deeper.value')
  • Используйте eval(), который работает, но я лично избегаю

Думаю, я много обошлась. Есть несколько моментов, которые я делаю в своем ответе, что я не затрагивайте, потому что они, хотя и актуальны, не являются частью вопрос. Однако, если это необходимо, я могу обновить свой ответ ссылками на некоторые из более технические аспекты, основанные на спросе.

Я потратил много времени на это, поэтому надеюсь, что это поможет людям.

Спасибо за чтение!

Ответ 3

Ссылка на ИСТОЧНИК

    module.exports = function isset () {
  //  discuss at: http://locutus.io/php/isset/
  // original by: Kevin van Zonneveld (http://kvz.io)
  // improved by: FremyCompany
  // improved by: Onno Marsman (https://twitter.com/onnomarsman)
  // improved by: Rafał Kukawski (http://blog.kukawski.pl)
  //   example 1: isset( undefined, true)
  //   returns 1: false
  //   example 2: isset( 'Kevin van Zonneveld' )
  //   returns 2: true

  var a = arguments
  var l = a.length
  var i = 0
  var undef

  if (l === 0) {
    throw new Error('Empty isset')
  }

  while (i !== l) {
    if (a[i] === undef || a[i] === null) {
      return false
    }
    i++
  }

  return true
}

phpjs.org в основном удален в пользу locutus Вот новая ссылка http://locutus.io/php/var/isset

Ответ 4

if (!('foo' in obj)) {
  // not set.
}

Ответ 5

//
//  tring to reference non-existing variable throws ReferenceError 
//  before test function is even executed
//
//  example, if you do:
//    
//     if ( isset( someVar ) ) 
//        doStuff( someVar );
//   
//  you get a ReferenceError ( if there is no someVar... ) 
//  and isset fn doesn't get executed.
//
//  if you pass variable name as string, ex. isset( 'novar' );, 
//  this might work:
//
function isset ( strVariableName ) { 

    try { 
        eval( strVariableName );
    } catch( err ) { 
        if ( err instanceof ReferenceError ) 
           return false;
    }

    return true;

 } 
//
//

Ответ 6

Это простое решение работает, но не для глубокой проверки объекта.

function isset(str) {
    return window[str] !== undefined;
}

Ответ 7

Я всегда использую эту общую функцию для предотвращения ошибок как для примитивных переменных, так и для массивов и объектов.

isset = function(obj) {
  var i, max_i;
  if(obj === undefined) return false;
  for (i = 1, max_i = arguments.length; i < max_i; i++) {
    if (obj[arguments[i]] === undefined) {
        return false;
    }
    obj = obj[arguments[i]];
  }
  return true;
};

console.log(isset(obj));                   // returns false
var obj = 'huhu';
console.log(isset(obj));                   // returns true
obj = {hallo:{hoi:'hoi'}};
console.log(isset(obj, 'niet'));           // returns false
console.log(isset(obj, 'hallo'));          // returns true
console.log(isset(obj, 'hallo', 'hallo')); // returns false
console.log(isset(obj, 'hallo', 'hoi'));   // returns true

Ответ 8

Если вы используете underscorejs, я всегда использую

if (!_.isUndefined(data) && !_.isNull(data)) {
     //your stuff
}

Ответ 9

Это решение сработало для меня.

function isset(object){
    return (typeof object !=='undefined');
}

Ответ 10

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

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

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

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

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

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

Неподготовлено ReferenceError: foo не определен

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

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.

Ответ 11

function isset(variable) {
    try {
        return typeof eval(variable) !== 'undefined';
    } catch (err) {
        return false;
    }
}

Ответ 13

(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.

Ответ 14

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

Если вы кодируете среду ES6, посмотрите fooobar.com/questions/1903/....

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
);

Ответ 15

Для проверки существующего html-блока существует или нет, я использую этот код:

if (typeof($('selector').html()) != 'undefined') {
    // $('selector') is existing
    // your code here
}

Ответ 16

if (var) {
  // This is the most concise equivalent of Php isset().
} 

Ответ 17

Справочник PHP:

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

И подключите что-то вроде этого:

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

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

isset() возвращает TRUE, если var существует и имеет значение, отличное от 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 также проверяет, что переменная не NULL

Например

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

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

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

Ответ 18

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

    function _isset (variable) {
        if(typeof(variable) == "undefined" || variable == null)
            return false;
        else
            if(typeof(variable) == "object" && !variable.length) 
                return false;
            else
                return true;
    };

Ответ 19

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

Ответ 20

Если вы хотите проверить, существует ли элемент, просто используйте следующий код:

if (object) {
  //if isset, return true
} else {
  //else return false
}

Это образец:

function switchDiv() {
    if (document.querySelector("#divId")) {
        document.querySelector("#divId").remove();
    } else {
        var newDiv = document.createElement("div");
        newDiv.id = "divId";
        document.querySelector("body").appendChild(newDiv);
    }
}

document.querySelector("#btn").addEventListener("click", switchDiv);
#divId {
    background: red;
    height: 100px;
    width: 100px;
    position: relative;
    
}
<body>
  <button id="btn">Let Diiiv!</button>
</body>