Identifier quels objets sont lesquels est compliqué en JavaScript et FIMPING SUR Quels objets sont des tableaux a quelque chose d'un Solution Hacky . Heureusement, il réussit à travailler dans les deux cas suivants:
function inherits(obj, proto) { while (obj != null) { if (obj == proto) return true; obj = Object.getPrototypeOf(obj); } return false; } inherits(Object.create(Array.prototype), Array.prototype); // true
5 Réponses :
Que diriez-vous d'un instanceof opérateur? Il renvoie Cependant: p> SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO SO. > p> true code> pour tous vos cas:
L'instanceof Array ne fournit pas de manière fiable de vérifier lorsque nous passons des tableaux entre les cadres, car chaque cadre a son propre constructeur de tableau
Ceci est une solution raisonnable pour les environnements ou les nœuds unique. Gardez simplement à l'esprit le problème multi-cadre.
ECMAScript 5 a introduit array.isarray () code> dans JavaScript qui fournit un moyen fiable de vérifier. Pour les navigateurs plus anciens, nous résolvons cela par (cité à partir de ce Book )
var arr = Object.create(Array.prototype);
var arr1 = Object.create(Object.create(Array.prototype));
var arr2 = new Array();
var arr3 = [];
isArray(arr);
isArray(arr1);
isArray(arr2);
isArray(arr3);
array.isarray code> est exactement identique que
objet.pototype.tostring.call (arr) == '[Array d'objet]' code>. Cette solution ne fonctionnera pas si le prototype de l'objet est un objet qui a un prototype qui est un tableau.
var arr = objet.create (objet.create (array.pototype)); code>
@Nathanwall: Jetez un coup d'oeil à ce Réservez
Regarde mieux. Juste un Nitpick: il ne teste pas si quelque chose est un véritable tableau (comme décrit dans mon commentaire à la question initiale). Cela teste vraiment si quelque chose a été construit comme une matrice ou hérite de quelque chose qui a été construit comme une matrice (qui est différent). Donc, peut-être que "isarray" n'est pas le meilleur nom de la fonction. Cependant, cette solution satisfait à la question initiale et est probablement la meilleure que l'astucieux puisse accéder à ses conditions. Il doit juste être conscient de ce qui se passe vraiment.
@Nathanwall: mise à jour pour tester également l'objet actuel. Merci d'avoir souligné.
Ce que vous avez fait est essentiellement implémenter isprototypeof code> vous-même.
isprototypeof code> marche la chaîne pour vous, comme vous le faites manuellement.
@Torazaburo je suppose que la question est alors si isprototypeof code> a les mêmes problèmes avec plusieurs fenêtres que
instanceof code> (
Que diriez-vous de vérifier le constructeur?
voir http: // perfectionkills.com/how-ecmascript-5-still-does-not-ve-a-subclass-an-array/ pour l'exposition définitive des problèmes d'héritage de la matrice.
Quoi qu'il en soit, dans le plus simple cas, où vous faites p> Vous pouvez vérifier en utilisant Voir https://developer.mozilla.org/fr -Us / Docs / Web / JavaScript / Référence / Global_Objects / Objet / IsPrototype de . P> P> isprototypeof code>: p>
Il fonctionne comme une matrice, et à toutes fins, il s'agit d'une graisse p>
non. Il n'a aucune mise à jour automatique
propriété code>. Voir Cet article Pourquoi Il est tout à fait impossible pour la sous-classe
Array Code>. P>
Y a-t-il un moyen de déterminer si un objet hérite d'un prototype particulier? Je suppose que vous pouviez parcourir les prototypes, mais cela ressent un TAD Hacky. P> BlockQuote>
C'est juste comment le faire. Une approche plus propre qu'une fonction auto-écrite consisterait à utiliser le < code> instanceof code> opérateur : p>
xxx pré> blockQuote>
Je suis juste curieux: pourquoi voudriez-vous jamais créer un tableau comme ça?
objet.create (array.prototyp); code> et vérifiez-le via
objet.pototype.tostring.call (arr); code>
@ ZIM84: Je pense que ce n'est qu'un exemple. Dans de vraies applications, nous ne devrions jamais faire cela. Dans les applications réelles, l'objet.create (Array.ProTotype) peut être appelé ailleurs et transmettre l'objet créé à une autre fonction
Le problème est que vous n'avez pas vraiment de véritable tableau (par exemple, il n'a pas la propriété magique
code>, juste une seule qui ressemble à première vue). Ce que vous avez est un tableau, comme il arrive d'avoir toutes les méthodes d'un véritable tableau. Si vous souhaitez rechercher des goûts, vous devriez essentiellement simplement voir si elle a une propriété code> code> et n'est pas une chaîne. C'est le meilleur imo. Si vous souhaitez vérifier les érayes true, continuez à utiliser
objet.pototype.tostring.call code> ou
array.isarray cod> et savoir qu'un objet avec prototype de
array.pototype code> n'est pas nécessairement un véritable tableau.