Maison >interface Web >js tutoriel >Vérification du type JavaScript et propriétés internes [[Class]]

Vérification du type JavaScript et propriétés internes [[Class]]

黄舟
黄舟original
2017-02-28 14:53:141341parcourir

Tous les objets contiennent une propriété interne [[Class]]

Nous ne pouvons pas accéder directement à cette propriété, mais nous pouvons y accéder via une méthode
Cette méthode est Object.prototype.toString.call(...)
C'est aussi un moyen plus fiable de vérifier le type (instanceof, constructeur, etc. ne sont pas fiables)

Par exemple, si nous vérifions un tableau

Object.prototype.toString.call([1,2,3]);

Impression de console"[object Array]"
Le "Array" ici appelle en fait l'attribut [[Class]] à l'intérieur de la fonction native Array()
Nous pouvons encapsuler une fonction qui détecte le type

function classOf(obj){
    return Object.prototype.toString.call(obj).slice(8,-1);
}

La fonction est très simple, appelez simplement la méthode toString sur le prototype Object et interceptez les informations qui nous sont utiles
On peut essayer cette fonction

console.log(classOf({'a':1}));
console.log(classOf([1,2,3]));
console.log(classOf(function a(){}));
console.log(classOf(/a/));
console.log(classOf(123));
console.log(classOf('abc'));
console.log(classOf(true));
console.log(classOf(Symbol()));
console.log(classOf(undefined));
console.log(classOf(null));

Impression console

Mais nous avons trouvé que non seulement les objets, mais aussi les valeurs de type de base chaîne, nombre et booléen peuvent être imprimés
C'est parce que JavaScript encapsule un objet encapsulant pour les valeurs de type de base
les transformant en objets, et il y a des attributs [[ Class]] sur String(), Number() et Boolean()
Bien que undefined et null n'aient pas de fonctions natives correspondantes Undefined() et Null(), il y a toujours des attributs internes renvoyés

Par cette fonction, nous pouvons déterminer avec précision le type
Nous pouvons même déterminer la liste des paramètres

function demo(){
    console.log(classOf(arguments));
}
demo();//"Arguments"

Retour à Object.prototype.toString.call(...) Pourquoi est-il si difficile de passer une chaîne pour déterminer le type
Nous pouvons voir ce qui se passe si nous appelons directement toString()

console.log({'a':1}.toString());
console.log([1,2,3].toString());
console.log(function a(){}.toString());
console.log(/a/.toString());
console.log(123..toString());
// 只写一个点会被当成小数点,所以再写一个点代表方法调用console.log('abc'.toString());
console.log(true.toString());
console.log(Symbol().toString());
// 基本类型调用方法,会自动封装为对象
// 不能使用undefined.toString()或null.toString()会报错,因为没有对应的封装对象

Nous pouvons voir que seuls les objets ordinaires sont renvoyés comme nous voulons Oui,
C'est parce que les objets ordinaires appellent directement la méthode toString sur le prototype supérieur Object
, tandis que les tableaux, les fonctions et ces objets d'emballage de base héritent de Object et
remplacent certaines méthodes
Lors de la recherche la méthode toString, la méthode sur la propre chaîne de prototype doit être trouvée en premier
Nous devons donc utiliser call pour appeler la méthode toString de d sur le prototype supérieur Object.prototype

Ce qui précède est le type JavaScript vérifiez et Le contenu de l'attribut interne [[Class]], veuillez faire attention au site Web PHP chinois (www.php.cn) pour plus de contenu connexe !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn