Object類型
對象字面量表示法:
var person={ name:"Nicholas", age:29, 5:true };
這人例子會創建一個對象,包含三個屬性:name,age和5。但這里的數值屬性名會自動轉換為字符串。
對象屬性的訪問:點表示法和方括號語法
alert(person["name"]); // "Nicholas" alert(person.name); // "Nicholas"
從功能上看,這兩種訪問對象屬性的方法沒有任何區別,但方括號語法的主要優點是可以通過變量來訪問屬性,如:
var propertyName="name"; alert(person[propertyName]
如果屬性名中包含會導致語法錯誤的字符,或者屬性名使用的是關鍵字或保留字,也可以使用方括號表示法,如:
person["first name"]="Nicholas";
Array類型
在讀取和設置數組的值時,要使用方括號并提供相應值的基本0的數字索引,如
var colors=["red","blue","green"]; alert(colors[0]); //顯示第一項:red colors[2]="black" //修改第三項 colors[3]="brown"; //新增第四項
如果設置某個值的索引超過了數組現有項數,如這個例子中的colors[3]所示,數組就會自動增加到該索引值加1的長度(就這個例子而言,索引是3,因此數組長度是4)
數組的length屬性很有特點--它不是只讀的。因此,通過設置這個屬性,可以從數組的末尾移除項或向數組中添加項,如:
var colors=["red","blue","green"]; colors.length=2; alert(colors[2]); //underfined
利用length屬性也可以方便地在數組末尾添加新項,如下所示:
var colors=["red","blue","green"]; colors[colors.length]="black"; colors[colors.length]="brown";
數組排序
數組有sort()方法,接收一個比較函數作為參數,以便我們指定哪個值位于哪個值的前面。
function compare(value1,value2){ if(value1<value2) return -1; else if(value1>value2) return 1; else return 0; } var values=[0,1,5,15,10]; values.sort(compare); alert(values); //0,1,5,10,15
對于數值類型或者其valueof()方法會返回數值類型的對象,可以使用一個更簡單的比較函數。
function compare(value1,value2) return value2-value1;
操作方法
slice():能夠基于當前數組中的一或多個項創建一個新數組。slice()方法可以接受一或兩個參數,即要返回項的起始和結束位置。在只有一個參數的情況下,slice()方法返回從
該參數指定位置開始到當前數組末尾的所有項。如果有兩個參數,該方法返回起始和結束位置之間的項--但不包括結束位置的項。注意,slice()方法不會影響原始數組。例子:
var colors=["red","blue","green","yelllow","purple"]; var colors2=colors.slice(1); //blue,green,yelllow,purple var colors3=colors.slice(1,4); // blue,green,yelllow
如果slice()方法的參數中有一個負數,則用數組長度加上該數來確定相應的位置。例如,在一個包括5項的數組上調用slice(-2,-1)與調用slice(3,4)得到的結果相同。如果結束
位置小于起始位置,則返回空數組。
Date類型
在調用Date構造函數而不傳遞參數的情況下,新創建的對象自動獲得當前日期和當前時間。
Date.UTC()的參數分別是年份,基于0的月份(一月是0,二月是1,以此類推),月中的哪一天(1到31),小時數(0到23),分鐘,秒以及毫秒數。
var allFives=new Date(Date.UTC(2005,4,5,17,55,55)); //GMT時間2005年5月5日下午5:55:55
Date類型的valueOf()方法,不返回字符串,而是返回日期的毫秒表示。
Function類型
函數聲明:
function sum(num1,num2){ return num1+num2; }
函數表達式:
var sum=function sum(num1,num2){ return num1+num2; };
第二種方法要在函數末尾加一個分號,就像聲明其他變量時一樣。
由于函數名僅僅是指向函數的指針,因此函數名與包含對象指針的其他變更沒有什么不同。換句話說,一個函數可能會有多個名字,如下面的例子:
function sum(num1,num2){ return num1+num2; } alert(sum(10,10)); //20 var anotherSum=sum; alert(anotherSum(10,10)); //20 sum=null; alert(anotherSum(10,10)); //20
解析器在向執行環境中加載數據時,對函數聲明和函數表達式并非一視同仁。解析器會率先讀取函數聲明,并使其在執行任何代碼之前可用(可以訪問);至于函數表達式,則必須等
到解析器執行到它所在的代碼行,才會真正被解析執行。請看下面的例子-
alert(sum(10,10)); function sum(num1,num2){ return num1+num2; }
以上代碼完全可以正常運行,因為在代碼執行之前,解析器就已經通過一個名為函數聲明提升的過程,讀取并將函數聲明添加到執行環境中。下面提等價的函數表達式:
alert(sum(10,10)); var sum=function sum(num1,num2){ return num1+num2; };
以上代碼之所以會在運行期間產生錯誤,原因在于函數位于一個初始化的語句中,而不是一個函數聲明。換句話說,在執行到函數所在語句之前,變更sum中不會保存有對函數的引用 。
函數內部屬性
在函數內部,有兩個特殊的對象:arguments和this.其中,arguments,它是一個類數組對象,包含著傳入函數中的所有參數。雖然arguments的主要用途就是保存函數參數,但這個對象
還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。請看下面這個非常經典的階乘函數。
function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }
定義階乘函數一般都要用到遞歸算法;如上面的代碼所示,在函數有名字,而且名字以后也不會變的情況下,這樣定義沒有問題。但問題是這個函數的執行與函數名factorial緊
緊耦合在了一起。為了消除這種緊耦合,可以像下面這樣使用arguments.callee。
function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } }
this引用的是函數據以執行的環境對象
函數方法
每個函數都包含兩個非繼承而來的方法:apply()和call()。這兩個方法的用途都是在特定的作用域中調用函數,實際上等于設置函數體內的this對象的值。
首先,apply()方法接收兩個參數:一個是在其中運行函數的作用域,另一個是參數數組。其中,第二個參數可以是Array的實例,也可以是arguments對象。例如:
function sum(num1,num2){ return num1+num2; } function callSum1(num1,num2){ return sum.apply(this,arguments); //傳入arguments對象 } function callSum2(num1,num2){ return sum.apply(this,[num1,num2]); //傳入數組 } alert(callSum1(10,10)); //20 alert(callSum2(10,10)); //20
call方法與apply方法的作用相同,它們的區別僅在于接收參數的方式不同。對于call()方法而言,第一個參數this值沒有變化,變化的是其余參數都要直接傳遞給函數。換句
話說,在使用call()方法時,傳遞給函數的參數必須逐個列舉出來,如下面所示:
function sum(num1,num2){ return num1+num2; } function callSum(num1,num2){ return sum.call(this,num1,num2); //傳入arguments對象 } alert(callSum(10,10)); //20
事實上,傳遞參數并非apply()和call()真正的用武之地;它們真正強大的地方是能夠擴充函數賴于運行的作用域。下面來看個例子:
window.colors="red"; var o={colors:"blue"}; function sayColor(){ alert(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue
基本包裝類型
ECMScript還提供了3個特殊的引用類型:Boolean,Number和String。這些類型與其他引用類型相似,但同時也具有與各自的基本類型相應的特殊行為。
引用類型與基本包裝類型的主要區別就是對象的生存期。使用new操作符創建的引用類型的實例,在執行流離開當前作用域之前都一直保存在內存中。而自動創建的基本包裝類型
的對象,則只存在于一行代碼的執行瞬間,然后立即被銷毀。這意味著我們不能在運行時為基本類型值添加屬性和方法。來看下面的例子:
var s1="some text"; s1.color="red"; alert(sl.color); //undefined
Object構造函數與會像工廠方法一樣,根據傳入值的類型返回相應基本包裝類型的實例。如:
var obj=new Object("some text"); alert(obj instanceof String); //true
Boolean類型
var falseObject=new Boolean(false); var result=falseObject&&true; alert(result) ; //true var falseValue=false; result=falseValue&&true; alert(result);
在這個例子中,我們使用false值創建了一個Boolean對象。然后,將這個對象與基本類型值true構成了邏輯與表達式。在布爾運算中,false&&true等于false。可就,示例中的這行代碼是對falseObject而不是對它的值(false)進行求值。前面討論過,布爾表達式中的所有對象都會被轉換為true,因此falseObject對象在布爾表達式中代表的就是true
Number類型
toFixed()方法會按照指定的小數位返回數值的字符串表示,如:
var num=10; alert(num.toFixed(2)); //10.00
在全局作用域中聲明的所有變更和函數,都成為window對象的屬性。
Math對象
Math.ceil()執行向上舍入,它總是將數值向上舍入為最接近的整數。
Math.floor()執行向下舍入,它總是將數值向下舍入為最接近的整數。
Math.round()執行標準舍下,即四舍五入為最接近的整數
文章列表