Object類型
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類型
//定義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
檢測數組:
確定一個值是哪種基本類型(Undefined,Null,Boolean,Number,String)使用typeof操作符,確定一個值是哪種引用類型使用instanceof操作符。
之所以Array中新增了Array.isArray()方法,是因為instanceof操作符是在只有一個全局執行環境的情況下;如果包含多個框架,那就存在兩個以上不同的全局環境,就存在兩個以上的不同版本的Array構造函數。 棧方法(LIFO):Array通過push(接收任意數量的參數,逐個添加到數組末尾)和pop(從數組末尾移除最后一項,并減少length值,返回移除的項)兩個方法可以實現類似棧的行為。
隊列方法(FIFO):Array通過shift(從數組前端取得項)和push或unshift(在數組前端添加任意個項并返回新數組的長度)和pop兩種都能實現模擬隊列的形式。
重排序方法:reverse(反轉數組項的順序);sort(實現排序,接收一個自定義函數,通過負數,0,正數)
操作方法:concat(基于接收的參數添加到副本數組中,并返回數組的副本);slice(返回起始和結束位置之間的項,但不包括結束位置的項);
splice()方法:可以刪除任意數量的項splice(0,2)會刪除前兩項(要刪除第一項的位置和要刪除的項數);可以向指定位置插入多個項;可以向指定位置插入任意數量的項 同時刪除任意數量的項。
位置方法:ECMAScript 5為數組實例添加了兩個位置方法:indexOf()和lastIndexOf()
迭代方法:
every():接收一個函數,如果對于數組每一項都返回true,結果返回true。
some():接收一個函數,如果對于數組中有返回true的項,結果就返回true,注意與every區別。
filter():接收一個函數,返回滿足條件也就是true的項。
forEach():對數組中每一項運行給定的函數。
map():運行給定的函數,返回每次函數調用的 結果組成的數組。
歸并方法:reduce(從數組第一項開始)和reduceRight(從數組最后一項開始)。
Function類型
函數實際上是對象,每個函數都是Function類型的實例,都與其他引用類型一樣具有屬性和方法。因此函數名實際上也是一個指向函數對象的指針。
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 };
函數聲明與函數表達式是有區別的,解析器在向執行環境加載數據時,會率先讀取函數聲明,并使其在執行任何代碼之前可以訪問;而函數表達式則需要等到解析器執行到它所在的代碼行才會真正被解釋執行,也就是說函數表達式要寫在調用函數代碼的前面。
函數可以作為值來使用,既可作為參數也可作為返回值,如下例子:
//根據屬性名來創建一個比較函數,來指明按照哪個屬性來排序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"));
函數內部屬性:
在函數內部,有兩個特殊對象:arguments和this。arguments的主要用途是保存函數參數,其中有個callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。
//簡單的遞歸算法,但是函數內部的執行和函數名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); } }
另外一個函數對象的屬性是:caller。其保存著調用當前函數的函數的引用。也就是誰調用的函數,caller就把它的引用保存下來。
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對象的屬性。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com