602 votes

équivalent JavaScript de isset()

En PHP, vous pouvez faire if(isset($array['foo'])) { ... } . En JavaScript, vous utilisez souvent if(array.foo) { ... } de faire la même chose, mais ce n'est pas exactement la même déclaration. La condition sera également évaluée à faux si array.foo existe mais est false ou 0 (et probablement d'autres valeurs aussi).

Quel est l'équivalent parfait de la fonction isset en JavaScript ?

Dans un sens plus large, un guide général et complet sur la gestion par JavaScript des variables qui n'existent pas, des variables sans valeur, etc. serait pratique.

1 votes

J'ai écrit une fonction qui testera l'existence de la propriété d'un objet quelle que soit la profondeur de la requête : stackoverflow.com/a/12681101/1268003 En utilisant mon code, combiné à certaines connaissances partagées par @CMS dans ce fil de discussion, vous pouvez facilement écrire une fonction globale qui fonctionne très bien comme le isset de PHP.

4 votes

Si vous utilisez Underscore.js essayez _.isUndefined(arr.foo)

0 votes

Le chaînage facultatif est probablement ce que la plupart des gens recherchent. stackoverflow.com/a/60845999/2100372

1002voto

CMS Points 315406

J'utilise généralement le typeof opérateur :

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

Il retournera "undefined" soit si la propriété n'existe pas ou si sa valeur est undefined .

(Voir aussi : <a href="https://stackoverflow.com/questions/3420071/difference-between-undefined-and-not-being-defined-in-javascript/3420160#3420160">Différence entre <code>undefined</code> et ne pas être défini. </a>)

Il existe d'autres moyens de savoir si une propriété existe sur un objet, comme la fonction hasOwnProperty méthode :

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

Et le in opérateur :

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

La différence entre les deux derniers est que le hasOwnProperty La méthode vérifiera si la propriété existe physiquement sur l'objet (la propriété n'est pas héritée).

Le site in L'opérateur vérifiera toutes les propriétés accessibles dans la chaîne des prototypes, par exemple :

var obj = { foo: 'bar'};

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

Comme vous pouvez le voir, hasOwnProperty renvoie à false et le in L'opérateur retourne true lors de la vérification de la toString cette méthode est définie plus haut dans la chaîne des prototypes, car obj hérite du formulaire Object.prototype .

24 votes

Pourquoi utiliser typeof plutôt que if( obj.foo !== undefined ) ?

7 votes

Ah. Un jour, j'écrirai un morceau de Javascript vraiment multi-navigateur. Jusque là...

0 votes

Cela ne devrait-il pas être obj.hasOwnProperty('foo') pas obj.hasOwnProperty('bar') ?

25voto

IJas Points 2380

Référence à la SOURCE

    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 a été abandonné au profit de locutus. Voici le nouveau lien http://locutus.io/php/var/isset

6 votes

Cela soulèvera une exception lors de l'appel de isset(abc.def.ghi) au cas où abc.def est indéfinie. Cependant, en combinant cette solution avec celle qui accepte un nom de variable sous la forme d'une chaîne, elle sera identique à la version PHP.

17voto

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

8voto

public override Points 199
//
//  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;

 } 
//
//

8voto

Cette solution simple fonctionne, mais pas pour le contrôle des objets profonds.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X