文章出處

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()執行標準舍下,即四舍五入為最接近的整數


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()