Objekttyp
1 //创建方式一 2 var person = new Object(); 3 person.name = "jack"; 4 person.age = 12; 5 6 //创建方式二 7 var person = { 8 name:"jack", 9 age:1210 }11 //创建空对象12 var person = {};//与new Object()相同13 14 //访问方式15 person["name"]; jack16 person.name; jack17 //以上两种方式区别在于使用中括号方式可以通过变量访问18 var propertyName="name";19 person[propertyName]; jack20 person["first name"] = "jack";//如果属性名有空格
Array-Typ
//定义var array = new Array();var array2 = new Array("a","b","c");var array3 = ["a","b","c"];//修改array3[2] = "d";//array3:a,b,d//新增array3[3] = "d";//array3:a,b,c,darray3[length] = "d";//array3:a,b,c,d第二种新增方式//末尾删除元素//数组的length属性不是只读的,所以通过改变length可以从数组末尾移除array3.length=3;//array3:a,b,c
Array erkennen:
Bestimmen Sie, welcher Grundtyp ein Wert ist (Undefiniert, Null, Boolean, Zahl, String). Verwenden Sie den Operator „typeof“, um zu bestimmen, welcher Typ ein Wert ist. Referenz Typen verwenden den Instanzoperator.
Der Grund, warum die Array.isArray()-Methode zu Array hinzugefügt wird, liegt darin, dass der Instanceof-Operator verwendet wird, wenn nur eine globale Ausführungsumgebung vorhanden ist und es mehr als zwei verschiedene In gibt In der globalen Umgebung gibt es mehr als zwei verschiedene Versionen des Array-Konstruktors. Stack-Methode (LIFO) : Array übergibt push (empfängt eine beliebige Anzahl von Parametern und fügt sie einzeln am Ende des Arrays hinzu) und pop (entfernt das letzte Element vom Ende des Arrays und reduziert den Längenwert, gibt das entfernte Element zurück) Zwei Methoden können ein stapelähnliches Verhalten erreichen.
Warteschlangenmethode (FIFO) : Array durchläuft Shift (holt Elemente von der Vorderseite des Arrays) und Push oder Unshift (fügt eine beliebige Anzahl von Elementen an die Vorderseite hinzu). des Arrays und gibt ein neues Array zurück. Sowohl die Länge als auch der Pop können die Form einer simulierten Warteschlange realisieren.
Neuordnungsmethode : umkehren (die Reihenfolge der Array-Elemente umkehren) (Sortierung implementieren, eine benutzerdefinierte Funktion erhalten, negative Zahlen übergeben, 0, positive Zahlen)
Operationsmethode: concat (zum Kopierarray basierend auf den empfangenen Parametern hinzufügen und eine Kopie des Arrays zurückgeben (die Start- und Endpositionen zurückgeben); ) Elemente dazwischen, jedoch ohne Elemente an der Endposition);
splice()-Methode: Sie können eine beliebige Anzahl von Elementen löschen. splice(0,2) löscht die ersten beiden Elemente (die Position und die Summe der erstes zu löschendes Element Die Anzahl der zu löschenden Elemente kann an der angegebenen Position eingefügt werden und es können beliebig viele Elemente gleichzeitig gelöscht werden.
Positionsmethoden: ECMAScript 5 fügt zwei Positionsmethoden für Array-Instanzen hinzu: indexOf() und lastIndexOf()
Iterationsmethode :
every(): Empfängt eine Funktion. Wenn für jedes Element im Array „true“ zurückgegeben wird, gibt das Ergebnis „true“ zurück.
some(): Empfängt eine Funktion, die „true“ zurückgibt, das Ergebnis ist „true“.
filter(): Empfängt eine Funktion und gibt Elemente zurück, die die Bedingung erfüllen, was wahr ist.
forEach(): Führt die angegebene Funktion für jedes Element im Array aus.
map(): Führen Sie die angegebene Funktion aus und geben Sie ein Array zurück, das aus den Ergebnissen jedes Funktionsaufrufs besteht.
Merge-Methode : Reduce (beginnend mit dem ersten Element im Array) und ReduceRight (beginnend mit dem letzten Element im Array) .
Funktionstyp
Funktionen sind eigentlich Objekte. Jede Funktion ist eine Instanz des Funktionstyps und verfügt über dieselben Eigenschaften und Methoden wie andere Referenztypen. Der Funktionsname ist also eigentlich ein Zeiger auf das Funktionsobjekt.
1 //使用函数声明语法定义 2 function sum(num1,num2) 3 { 4 return num1+num2; 5 } 6 //使用函数表达式定义,注意结尾要加分号 7 var sum = function(num1,num2) 8 { 9 return num1+num2;10 };
Es gibt einen Unterschied zwischen Funktionsdeklaration und Funktionsausdruck. Wenn der Parser Daten in die Ausführungsumgebung lädt, liest er zuerst die Funktionsdeklaration und lässt ihn beliebigen Code ausführen. Auf ihn kann vorher zugegriffen werden, während der Funktionsausdruck warten muss, bis der Parser die Codezeile ausführt, in der er sich befindet, bevor er tatsächlich interpretiert und ausgeführt wird. Das heißt, der Funktionsausdruck muss vor dem Code geschrieben werden das ruft die Funktion auf.
Funktion kann als Wert verwendet werden, entweder als Parameter oder als Rückgabewert, wie im folgenden Beispiel gezeigt:
//根据属性名来创建一个比较函数,来指明按照哪个属性来排序function createComparisonFunction(propertyName) {return function(object1,object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; if(value1<value2){ return -1; }else if(value1<value2){ return 1; }else{ return 0; } } } //利用数组data调用sort()方法data.sort(createComparisonFunction("name"));
Funktionsinterne Attribute:
Innerhalb einer Funktion gibt es zwei spezielle Objekte: Argumente und This. Der Hauptzweck von Argumenten besteht darin, Funktionsparameter zu speichern, von denen es ein callee-Attribut gibt, das einen Zeiger auf die Funktion darstellt, die das Argumentobjekt besitzt.
//简单的递归算法,但是函数内部的执行和函数名factorial耦合在一起function factorial(num) {if(num<=1) {return 1; }else{return num*factorial(num-1); } }//利用arguments.callee解决function factorial(num) {if(num<-1){return 1; }else{return num*arguments.callee(num-1); } }
Ein weiteres Attribut des Funktionsobjekts ist: Aufrufer. Es enthält einen Verweis auf die Funktion, die die aktuelle Funktion aufgerufen hat. Das heißt, wer auch immer die Funktion aufruft, der Aufrufer speichert seine Referenz.
function outer() { inner(); }function inner() { alert(inner.caller);//弹出outer()函数的源代码 alert(arguments.callee.caller);//和上一句一样}
函数属性和方法:
每个函数都包含两个属性:length(函数接收的命名参数的个数)和prototype。
每个函数都包含两个非继承而来的方法:apply()和call(),在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。apply()接收两个参数,一个在其中运行函数的作用域,拎一个是参数数组(可以是array或arguments对象)。call()第一个参数和apply一样,后面必须明确传入每个参数。除了用法不同其他的没什么不同。另外他们真正强大的地方是能够扩充函数赖以运行的作用域。
function sum(num1,num2) { return num1+num2; } sum.apply(this, [num1,num2] ); sum.call(this,num1, num2);//扩充函数作用域window.color = "red";var o = {color:"blue"};function showColor(){ alert(this.color); } showColor();//redshowColor.call(this);//redshowColor.call(window);//redshowColor.call(o);//blue
也可以使用bind()方法。
基本包装类型
为了便于操作基本类型值,ECMAScript引入3个特殊的引用类型:Boolean,Number,String。所谓包装类型,就是将基本类型包装起来,放一些操作方法和属性等。
每当读取一个基本类型值的时候,后台就会创建与一个对应的基本包装类型的对象,从而能让我们可以调用某些方法操作这些数据。
var s1 = "some text";var s2 = s1.substring(2);//后台内部相当于如下代码var s1 = new String("some text");var s2 = s1.substring(2); s1 = null;
当第二行代码访问s1时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值,读取模式访问字符串时,后台都会自动完成下列处理:
创建String类型的一个实例。
在实例上调用指定的方法。
销毁这个实例。
引用类型与基本包装类型的主要区别就是对象的生存期。使用new 操作符在执行流离开当前作用域之前一直保存在内存中。而自动创建的基本包装类型的对象,则只存在一行代码的执行瞬间,然后立即销毁。
单体内置对象
内置对象:
由ECMAScript实现提供的,不依赖于宿主环境的对象,程序执行之前就已经存在,比如:Object,Array和String。另外还有Global和Math。
Global对象:
URI编码方法:通过encodeURI()和encodeURICOMponent()方法对URI进行编码,以便发送给浏览器。区别在于第一个不会对本身属于URI的特殊字符进行编码,例如冒号,正斜杠,问号和井号。而另一个则会对它发现的任何非标准字符进行编码。与这两个方法对应的是:decodeURI(只能对使用encodeURI()替换的字符进行解码)和decodeURIComponent(针对encodeURIComponent()编码的字符)。
eval()方法像是一个解析器。比如eval("function say(){ alert(' Hi '); }");但是创建的任何变量或者函数都不会被提升,只有在eval执行时候才创建。
window对象,全局作用域中声明的所有变量和函数,都成为了window对象的属性。
Das obige ist der detaillierte Inhalt vonEine Erklärung der JavaScript-Referenztypen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!