Heim  >  Artikel  >  Web-Frontend  >  Warum Object.prototype.toString.call(obj) verwenden, um den Objekttyp zu erkennen?

Warum Object.prototype.toString.call(obj) verwenden, um den Objekttyp zu erkennen?

青灯夜游
青灯夜游nach vorne
2018-10-10 17:27:452469Durchsuche

Ich habe kürzlich einige js-Interviews mit 25 wesentlichen JavaScript-Interviewfragen* durchgeführt. Die erste davon lautet: Welche Nachteile hat die Verwendung von typeof bar === "object", um zu erkennen, ob „bar“ ein Objekt ist? Wie kann man es vermeiden?

Dies ist eine sehr häufige Frage. Können Sie typeof verwenden, um eine Objektvariable genau zu bestimmen? Das Ergebnis von null ist auch das Ergebnis von Array ist auch ein Objekt. Manchmal brauchen wir ein „reines“ Objekt. Wie kann man es vermeiden? Eine bessere Möglichkeit ist:

console.log(Object.prototype.toString.call(obj) === "[object Object]");

Verwenden Sie die obige Methode, um verschiedene Typen zu unterscheiden:

(Benutzerdefinierte Objekttypen können nicht unterschieden werden, benutzerdefinierte Typen können mithilfe von „instanceof“ unterschieden werden)

console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));//[object Object]

Warum können wir den Unterschied so erkennen? Deshalb habe ich mir die Verwendung der toString-Methode angesehen: Die toString-Methode gibt einen String zurück, der dieses Objekt widerspiegelt.

Warum dann nicht einfach obj.toString() verwenden?

console.log("jerry".toString());//jerry
console.log((1).toString());//1
console.log([1,2].toString());//1,2
console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)
console.log(function(){}.toString());//function (){}
console.log(null.toString());//error
console.log(undefined.toString());//error

ist auch das Erkennungsobjekt obj, das die toString-Methode aufruft (Informationen zur Verwendung der toString()-Methode finden Sie in der ausführlichen Erklärung von toString), das Ergebnis von obj.toString( ) und Object. Die Ergebnisse von prototype.toString.call(obj) unterscheiden sich von .

Das liegt daran, dass toString die Prototypmethode von Object ist und Array, function und andere Typen als Instanzen von Object alle toString überschreiben Methode. Wenn verschiedene Objekttypen die Methode toString aufrufen, wird basierend auf dem Wissen der Prototypenkette die entsprechende umgeschriebene Methode toString aufgerufen (der Funktionstyp gibt eine Zeichenfolge zurück, deren Inhalt der Funktionskörper ist). , Der Array-Typ gibt einen String zurück, der aus Elementen besteht...) und ruft nicht die Prototyp-Methode toString für Object auf (gibt den spezifischen Typ des Objekts zurück), also verwenden Sie obj.toString() kann seinen Objekttyp nicht abrufen und kann nur obj in einen String-Typ konvertieren. Wenn Sie daher den spezifischen Typ eines Objekts abrufen möchten, sollten Sie die Prototyp-toString-Methode für Object aufrufen.

Wir können es überprüfen, indem wir die toString-Methode des Arrays löschen und sehen, was das Ergebnis sein wird:

var arr=[1,2,3];console.log(Array.prototype.hasOwnProperty("toString"));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));//false
console.log(arr.toString());//"[object Array]"

Nach dem Löschen der toString-Methode des Arrays , das Gleiche Wenn die arr.toString()-Methode erneut verwendet wird, gibt es keine Instanzmethode, die die Object-Prototypmethode abschirmt. Daher ruft arr entlang der Prototypenkette schließlich die toString-Methode von Object auf und gibt das und Object zurück .prototype.toString.call(arr) gleiches Ergebnis.

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Studium aller hilfreich sein wird. Weitere verwandte Tutorials finden Sie unter JavaScript-Video-Tutorial!

Verwandte Empfehlungen:

PHP-Video-Tutorial zum öffentlichen Wohlfahrtstraining

JavaScript-Grafik-Tutorial

JavaScript Online-Handbuch

Das obige ist der detaillierte Inhalt vonWarum Object.prototype.toString.call(obj) verwenden, um den Objekttyp zu erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen