11
votes

Obtenez 'indéfini' si 'window.undefined' est écrasé

Il semble que window.undefinfin est écritable, c'est-à-dire qu'il peut être défini sur autre chose que sa valeur par défaut (qui est, sans surprise, non défini ).

Le point est cependant que chaque fois que je me réfère à non défini , il fait référence à window.undefinefinhefinefinefin (comme fenêtre peut être supprimé dans des cas comme ceci).

Alors, comment puis-je réellement avoir accès à un non défini 'instance', afin de dire? Comment puis-je pouvoir définir une autre variable sur indéfini , si window.undefinefinine a été modifié?

Si je code: < PRE> XXX

Comment pourrais-je éventuellement résoudre ce problème?


7 commentaires

Corrigez le code qui écrase non défini ?


Je suppose que je le stockerais avant de le changer. var nonf = fenêtre.undefined; fenêtre.undifined = 'foo'; voiture myvar = undef;


Son point est Ce code aurait peut-être été exécuté par quelqu'un / quelque chose . Où prendre la valeur non défini à partir de là?


@John: Non, je ne veux pas vraiment dire ça - je voudrais rendre mon code sûr et stable et non fiable sur window.undefined . E.G., quelqu'un d'autre pourrait définir window.undefinefind et ensuite mon code est exécuté. Alors y a-t-il un moyen de toujours obtenir non défini ?


Êtes-vous en train de courir dans ce problème sur le terrain ou juste en théorie / test? Tandis que Window.undefinfin est écritable, il est évident que l'écriture est une très mauvaise idée. Y a-t-il des bibliothèques qui y écrivent?


Juste théoriquement - désolé si cela confondu personne.


Peut-être qu'il convient de souligner que les navigateurs modernes avec un soutien total de l'ECMA 5 ne vous permettent plus de remplacer les mots-clés réservés tels que par exemple. non défini de sorte que cela ne pourrait pas être un cas alors.


4 Réponses :


18
votes

La solution "standard" à ce problème consiste à utiliser l'opérateur vide intégré code>. Son objectif est de renvoyer indéfini:

function foo(arg1, arg2, undefined){ //undefined is the last argument
    //Use `undefined` here without worrying.
    //It is a local variable so no one else can overwrite it
}
foo(arg1, arg2);
//since you didn't pass the 3rd argument,
//the local variable `undefined` in foo is set to the real `undefined`.


0 commentaires

3
votes

En fait, en comparant quoi que ce soit avec non défini code> n'est pas une bonne idée du tout. Devrait utiliser typeof code> Opérateur à la place:

function isUndefined ( variant ) { return typeof variant === 'undefined' }


0 commentaires

17
votes

En plus des autres solutions, vous pouvez faire le truc Void 0 , qui renvoie toujours non défini indéfini de la fenêtre . < Pré> xxx


1 commentaires

Cela semble le plus simple et le plus efficace pour moi.



3
votes

Il faut suffire à déclarer une variable sans l'assigner à quoi que ce soit: xxx

mais pourquoi sur Terre est-il possible de changer de valeur non définie? Est-ce que quelqu'un connaît l'histoire derrière cela?


2 commentaires

Cela fonctionne de cette façon, mais il est nécessaire d'utiliser local_undefinefind à la place ( jsfiddle.net/vmjyd ). Et ce problème semble être réparé dans JavaScript 1.8.5 ( développeur.mozilla.org / FR / JavaScript / Référence / Global_Object S / ... ).


Correct lien ici: développeur.mozilla.org/en-us/ Docs / JavaScript / Référence / ...