1. Originalwert und Referenzwert
Der Originalwert wird im Stapel und der Referenzwert im Heap gespeichert. Wie das Programm:
Kopieren Sie den Codecode wie folgt:
Funktion Person(id,name,alter){
this.id = id;
this.name = Name;
this.age = Alter;
}
Varnum = 10;
var bol = true;
var str = "abc";
var obj = neues Objekt();
var arr = ['a','b','c'];
var person = new Person(100,"Idiot's motto",25);
2. undefiniert und null
undefiniert: Die Variable ist undefiniert; es handelt sich um einen exklusiven Wert vom Typ Undefiniert;
null: Die Referenz wird nicht zugewiesen; es handelt sich um einen exklusiven Wert vom Typ Null.
typeof(undefiniert) == undefiniert;
typeof(null) == object;
undefiniert==null;
undefiniert!==null;
null Instanz des Objekts == false;
undefinierte Instanz des Objekts == false;
Obwohl es die Typen Undefiniert und Null gibt, zeigt das folgende Beispiel, dass diese beiden Typen unsichtbar sind, was bedeutet, dass wir nur ihre Werte verwenden können:
Alert(undefinierte Instanz von Undefiniert);
Alert(Null-Instanz von Null);
3. Pseudo-Array
Merkmale:
1) Hat ein Längenattribut;
2) Zugriff auf Daten in Indexreihenfolge wie bei einem Array;
3) Es gibt keine Array-spezifischen Datenmanipulationsmethoden wie Push, Pop, Slice ...
Pseudo-Arrays können über Array.prototype.slice in echte Arrays umgewandelt werden:
var faceArray = {0: 'a', 1: 'b', Länge: 2}//Standard-Pseudo-Array;
var realArray = Array.prototype.slice.call(fakeArray);
Pseudo-Arrays in js: Argumente, node.childNodes, document.getElementsByTagName()...
Problem im IE: node.childNodes im IE können nicht mit Slice konvertiert werden.
Pseudo-Array in Jquery: Jquery selbst ist ein Pseudo-Array:
Alert($('.class1').length); Alert($('.class1').[0].tagName);
4. Über einfache Typliterale
var a = 1; b = wahr, c = „ccc“;
Literale scheinen Typen zu haben
alarm(typeof a);//number
alarm(typeof b);//boolean
alarm(typeof c);//string
Aber es kann nicht durch Instanz von gemessen werden.
Alert(eine Instanz von Number)//false
alarm(eine Instanz eines Objekts)//false
Alert(b Instanz von Boolean)//false
Alert(b Instanz des Objekts)//false
Alert(c-Instanz von String)//false
Alert(c-Instanz des Objekts)//false
5. Das Prototypattribut der Funktion und das interne Prototypattribut der Objektinstanz
Jede Funktion (Konstruktor) verfügt über ein Prototypattribut, und jede Objektinstanz verfügt über ein unsichtbares (Mozilla macht es öffentlich und kann über __proto__ abgerufen werden), das auf das Prototypattribut des Konstruktors verweist Die eigene Prototypeneigenschaft bildet die Prototypenkette. Das Objekt ist das oberste Objekt, sodass alle Prototypenketten beim Zugriff auf die Eigenschaften/Methoden der Objektinstanz verweisen. Beginnen Sie mit der Suche bei der Objektinstanz selbst. Wenn diese nicht gefunden werden kann, suchen Sie entlang der Prototypenkette nach oben, bis Object.prototype.prototype == null ist.
6. Ein kleines Geheimnis des Konstrukteurs
Kopieren Sie den Codecode wie folgt:
var s = new function(){return "sss"};
Warnung(en);//[Objekt Objekt]
s = new function(){return new String("sss")};
Warnung(en);//sss
Erklärung dieses Codes:
Solange der Konstruktor nach dem neuen Ausdruck ein Referenzobjekt (Array, Objekt, Funktion usw.) zurückgibt, überschreibt er das von new erstellte anonyme Objekt. Wenn es einen primitiven Typ zurückgibt (wenn es keine Rückgabe gibt, wird es tatsächlich zurückgegeben). der primitive Typ undefiniert ), dann wird das von new erstellte anonyme Objekt zurückgegeben.
7. Der Prozess der Objekterstellung
Kopieren Sie den Codecode wie folgt:
Funktion Person(Name){
this.name = Name;
}
Person.prototype = {
getName: function(){return this.name}
};
var p = neue Person('zhangsan');
Entschlüsseln Sie den Erstellungsprozess von p:
◦Erstellen Sie ein integriertes Objekt obj und initialisieren Sie es.
◦Zeigen Sie den internen [[Prototyp]] von p auf Person.prototype;
◦Verwenden Sie p wie folgt und verwenden Sie Argumentparameter, um die interne Methode [[Call]] von Person aufzurufen, d. h. den Funktionskörper von Person auszuführen und den Rückgabewert zurückzugeben.
◦Wenn der vorherige Schritt einen Objekttyp zurückgibt, geben Sie diesen Wert an p zurück, andernfalls geben Sie obj zurück.
8. Eigene und geerbte Eigenschaften des Objekts
Kopieren Sie den Codecode wie folgt:
Funktion Person(Name){
this.name = Name;
}
Person.prototype = {
Typ: 'Mensch',
getName: function(){return this.name}
};
var p = neue Person('zhangsan');
alarm(p.hasOwnProperty('type'));//false
p.type = 'ren';
Alert(p.hasOwnProperty('type'));//true
Das laufende Ergebnis ist sehr klar. Die Eigenschaften eines Objekts können die gleichnamigen Eigenschaften in ihrem Prototyp nicht ändern, sondern nur eine gleichnamige Eigenschaft erstellen und ihr einen Wert zuweisen.
9.Erstellungsprozess von Funktionsobjekten
Erstellen Sie ein integriertes Objektobjekt fn;
Setzen Sie den internen [[Prototype]] von fn auf Function.prototype;
Legen Sie das interne Attribut [[Call]] fest, eine intern implementierte Methode, die die Logik von Funktionsaufrufen verarbeitet. (Einfach so verstanden, dass es auf den Funktionskörper zeigt);
Setzen Sie fn.length auf funArgs.length. Wenn die Funktion keine Parameter hat, setzen Sie fn.length auf 0;
Der Konstruktor von fn.prototype zeigt auf fn selbst;
Geben Sie fn zurück.
10. Prinzip der Instanz von
Um zu überprüfen, ob a eine Instanz von B ist, müssen Sie prüfen, ob sich das Objekt, auf das der Prototyp von B zeigt (Prototypattribut des Konstruktors), in der Prototypenkette von a befindet.
11. Vermutungen über Funktion und Objekt
Alert(Funktionsinstanz der Funktion);//true
Alert(Funktionsinstanz des Objekts);//true
Alert(Objektinstanz der Funktion);//true
Alert(Object-Instanz von Object);//true
Ich habe lange darüber nachgedacht, aber ich habe es noch nicht herausgefunden ...