63 votes

Est-ce que je dois utiliser une clé de propriété vide?

J'ai testé cela uniquement dans Firefox, mais il semble que vous puissiez utiliser une chaîne vide comme clé pour une propriété dans un objet. Par exemple, voyez la première propriété ici :

var countsByStatus = { 
  "": 23, //statut inconnu
  "started": 45,
  "draft": 3,
  "accepted": 23,
  "hold": 2345,
  "fixed": 2,
  "published": 345
}

En parcourant les spécifications EcmaScript, il apparaît que (au moins dans la version 5), les clés des propriétés sont définies comme des chaînes, et les chaînes comme 0 caractère ou plus. Cela implique qu'une chaîne vide est un nom de propriété valide selon les spécifications.

Quoi qu'il en soit, je suis tenté d'utiliser cela dans une section de code où je calcule des résumés de certains comptages par le statut d'un élément de données (similaire à ce que j'ai montré ci-dessus). Il y a des éléments qui pourraient ne pas avoir de statut, et j'ai besoin d'un espace réservé pour ceux-ci. Comme les statuts sont définis par l'utilisateur, je ne veux pas risquer d'utiliser un mot factice qui pourrait entrer en conflit.

Cela semble si simple et élégant, en regardant les données, je peux facilement comprendre ce que la chaîne vide signifierait. Cela rend également le code un peu plus efficace, car la chaîne vide serait la valeur exacte du statut dans les éléments sans statut.

Mais en même temps, mes instincts me disent qu'il y a quelque chose qui cloche. Je veux dire, en dehors de la possibilité qu'un navigateur ne prenne pas en charge cela, j'ai l'impression d'avoir rencontré un bug dans JavaScript qui sera corrigé un jour. Mais, en même temps, c'est le même sentiment que j'avais autrefois concernant de nombreuses autres fonctionnalités de JavaScript que j'utilise maintenant tous les jours (comme ce jour où j'ai découvert que && et || renvoient la valeur de l'un des opérandes, pas seulement vrai ou faux).

24voto

zzzzBov Points 62084

La clé d'un objet doit être une chaîne de caractères, et la chaîne vide ('') est une chaîne de caractères. Je n'ai jamais rencontré de problème inter-navigateur avec les chaînes vides, bien qu'il y ait eu très peu d'occasions où j'ai pensé qu'il était acceptable d'utiliser une chaîne vide comme nom de clé.

Je découragerais généralement l'utilisation de '' comme clé, mais pour une simple recherche, cela fonctionnera très bien et semble raisonnable. C'est un bon endroit pour ajouter un commentaire notant la circonstance exceptionnelle.

De plus, lors de la recherche, vous pouvez rencontrer des problèmes avec des valeurs qui sont converties en chaîne de caractères :

o = {...} //quelque objet
foo = 'bar';

//quelques exemples
o[foo] //retournera o['bar']
o[null] //retournera o['null']
o[undefined] //retournera o['undefined']

Si vous souhaitez utiliser la clé '' pour null et undefined, vous devrez peut-être utiliser une valeur de secours :

key = key || '';

Si vous pourriez avoir des valeurs non-chaînes passées, il est important de les convertir aussi :

key = key || '';
key = '' + key;

notez qu'une valeur de 0 se transformera en '', tandis qu'une valeur de '0' restera '0'.


Dans la plupart des cas, je constate que je choisis une valeur prédéfinie dans un objet. Pour vérifier que la valeur existe sur l'objet, il existe plusieurs options :

//sera faux si la valeur est fausse
if (o[key]) {...}

//retournera vrai pour les propriétés de l'objet ainsi que dans la hiérarchie de prototypes
if (key in o) {...}

//retournera vrai uniquement pour les propriétés de l'instance de l'objet
if (o.hasOwnProperty(key)) {...}

12voto

jAndy Points 93076

Techniquement, il n'y a rien de mal et vous pouvez l'utiliser en toute sécurité sur n'importe quel moteur js (que je connaisse). Puisque la spec d'ECMAScripts dit que toute clé d'objet est une chaîne, elle peut bien sûr aussi être une chaîne vide.

Le seul inconvénient est que vous ne pourrez jamais accéder à cette propriété avec la notation pointée

countsByStatus.;

conduira bien sûr à une erreur de syntaxe, il doit donc toujours être

countsByStatus[''];

C'est à peu près tout du point de vue technique. Si nous parlons du côté pratique, je voterais clairement pour un non, ne l'utilisez jamais.

Cela entraînera de la confusion et comme nous le savons tous, la confusion est l'ennemi.

3voto

hugomg Points 29789

Le problème est que puisque les statuts sont définis par l'utilisateur, rien n'empêche l'utilisateur d'utiliser également une chaîne vide comme statut, ruinant ainsi votre logique. De ce point de vue, ce que vous faites n'est pas différent de l'utilisation d'un nom personnalisé laid comme __$$unknown_status. (Eh bien, je dirais que le nom personnalisé laid est plus descriptif mais chacun ses goûts...)

Si vous voulez être vraiment sûr que la propriété "inconnu" ne risque pas de se chevaucher, vous devez la garder séparée:

var counts = {
    unknownStatus: 23,
    byStatus: {
        "": 17, //statut réel sans nom, (si cela a du sens)
        "started": 45,
        "draft": 3,
        "accepted": 23,
        "hold": 2345,
        "fixed": 2,
        "published": 345
    }
};

2voto

hvgotcodes Points 55375

Je pense que c'est ok. "" a une sémantique dans votre application, et c'est du javascript valide. Alors allez-y.

Notez que

x."" = 2;

va provoquer une erreur, donc vous devez utiliser une syntaxe comme

x[""] = 2;

0voto

Bergi Points 104242

Est-ce que "statut inconnu" est une valeur nulle ou est-ce que votre champ de statut est "non null" ?

Dans le premier cas, je dirais que vous devrez utiliser un compteur séparé ; dans le deuxième cas, je dirais que "vide" est un statut parfaitement valide - utilisez simplement le mot "inconnu" pour l'affichage au lieu de "". Cela pourrait entraîner de la confusion lorsque votre utilisateur utilise le même mot comme type de statut, mais pour éviter cela, vous pouvez simplement utiliser un style visuel différent pour le texte affiché comme "statut inconnu".

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