Heim  >  Artikel  >  Web-Frontend  >  JavaScript-Typprüfung und interne Eigenschaften [[Klasse]]

JavaScript-Typprüfung und interne Eigenschaften [[Klasse]]

黄舟
黄舟Original
2017-02-28 14:53:141288Durchsuche

Alle Objekte enthalten eine interne Eigenschaft [[Klasse]]

Wir können nicht direkt auf diese Eigenschaft zugreifen, aber wir können über eine Methode darauf zugreifen
Diese Methode ist Object.prototype.toString.call(...)
Dies ist auch eine zuverlässigere Möglichkeit, den Typ zu überprüfen (Instanz, Konstruktor usw. sind unzuverlässig).

Zum Beispiel, wenn wir ein Array überprüfen

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

Konsolendruck"[object Array]"
Das „Array“ hier ruft tatsächlich das [[Class]]-Attribut innerhalb der nativen Funktion Array() auf
Wir können eine Funktion kapseln, die den Typ erkennt

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

Die Funktion ist sehr einfach. Rufen Sie einfach die toString-Methode für den Objektprototyp auf und fangen Sie die für uns nützlichen Informationen ab
Wir können diese Funktion ausprobieren

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));

Konsolendruck

Aber wir haben es gefunden dass nicht nur Objekte, sondern auch Grundtypwerte wie Zeichenfolge, Zahl und Boolescher Wert gedruckt werden können
Dies liegt daran, dass JavaScript ein Kapselungsobjekt für Grundtypwerte umschließt
sie in Objekte umwandelt, und Es gibt Attribute [[ Klasse]] für String(), Number() und Boolean()
Obwohl undefiniert und null keine entsprechenden nativen Funktionen Undefiniert() und Null() haben, werden dennoch interne Attribute zurückgegeben

Durch Mit dieser Funktion können wir den Typ genau bestimmen
Wir können sogar die Parameterliste bestimmen

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

Zurück zu Object.prototype.toString.call(...) Warum ist das so mühsam? Übergeben Sie einen String, um den Typ zu bestimmen
Wir können sehen, was passiert, wenn wir toString() direkt aufrufen

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()会报错,因为没有对应的封装对象

Wir können sehen, dass nur gewöhnliche Objekte als zurückgegeben werden Wir wollen Ja,
Dies liegt daran, dass gewöhnliche Objekte die toString-Methode direkt auf dem obersten Prototyp-Objekt aufrufen
, während Arrays, Funktionen und diese grundlegenden Verpackungsobjekte Object erben und
einige Methoden überschreiben
Bei der Suche Bei der toString-Methode muss zuerst die Methode in der eigenen Prototypenkette gefunden werden
Wir müssen also call verwenden, um die toString-Methode von d im obersten Prototyp Object.prototype aufzurufen

Das Obige ist der JavaScript-Typ Überprüfen Sie den Inhalt des internen Attributs [[Klasse]]. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn