NO.1 引用類型中的Date類型
創建一個日期對象
var now = new Date();
如果對象中沒有傳入參數,則默認取當前時間
想要創建特定的日期對象,用Date.prase()或者Date.UTC();
var someDate = new Date(Date.parse("May 25, 2004"))等價于
var someDate = new Date("May 25,2004")
var allFives = new Date(Date.UTC(2005,4,5,17,55,55)); //表示GTM時間2005年5月5日下午5:55:55
var allFives = new Date(2005,4,5,17,55,55) //這兩個創建的時間對象都是基于系統設置的本地時區設置的
ES5中添加了Date.now()方法,返回表示調用這個方法時的日期和時間的毫秒數
這個方法簡化了使用Date對象分析代碼的工作,例如:
var start = Date.now()
doSomething()
var stop = Date.now()
var result = stop - start
繼承的方法toString,根據瀏覽器設置的地區相適應的格式返回日期和時間;
valueOf()方法,不返回字符串,返回日期的毫秒數表示,,因此日期可以比較大小;
NO.2 RegExp類型
JS通過RegExp類型來支持正則表達式
var expression = / 表達式(pattern)/(標志g/i/m)
標志:
g表示全局,即模式將被應用于所有字符串,而非在發現第一個匹配項時立即停止
i表示不區分大小寫模式
m表示多行模式,即在到達一行文本末尾時,還會繼續查找下一行是否存在于模式中匹配的項
NO.3 Function類型
每個函數都是Function的實例,并且和其他引用類型一樣具有屬性和方法,關鍵句:『函數是對象,函數名是指針』
函數定義的三種方式:
1.使用函數聲明語法直接定義
function sum (a , b){
return a+b ;
}
2.使用函數表達式
var sum = function(a, b){
return a +b ;
};
3.使用Function的構造函數
var sum = new Function("num1","num2", "return num1+num2");
一個函數可能會有多個名字:
function sum(sum1, sum2){
return sum1 + sum2
}
alert(sum(10,10)); //20
var anotherSum = sum
alert(anotherSum(10,10)) //20
sum = null
alert(anotherSum(10,10)) //20
注意,使用不帶圓括號的函數名是訪問函數指針,而非調用函數,以上例子就是anotherSum和sum都指向同一個函數,因此anotherSum也可以被調用
函數聲明提升:
解析器會率先讀取函數聲明,并使之在執行任何代碼之前可以用,例如:
alert(sum(10, 10));
function sum(sum, sum2){
return num1+num2;
} //20
以上代碼是可以執行的,因為在代碼開始執行之前,解析器就通過一個名為函數聲明提升的過程,讀取并將函數聲明添加到執行環境中。如果將函數換成表達式方式定義,將會報錯;
alert(sum(sum1, sum2));
var sum = function(sum, sum2){
return num1+num2;
} //error
作為值的函數:
因為JS中的函數名本身就是變量,所以函數也是可以作為值來使用,也就是說,不僅僅可以像傳遞參數一樣把一個函數傳遞給另一個函數,也可以將一個函數作為另一個函數的結果返回。例子:
function callSomeFunction(someFunction, someArgument){
return someFunction(someArgument);
}
這個函數接收2個參數,第一個是一個函數,第二個參數是要傳遞給該函數的一個值,然后就可以像下面的例子傳遞函數了
function add10(num){
return num +10;
}
var result1 = callSomeFunction(add10, 10)
alert(result1); //20
函數內部屬性:
在函數內部,有兩個特殊的對象,arguments和this
arguments類數組對象,包含著傳入函數中的所有參數。arguments還有一個屬性,叫做callee。這個屬性是一個指針,指向擁有這個arguments對象的函數。
callee的作用,是用來消除函數引用自己時的耦合,比如:
function factorial(num){
if(num<1){
return 1;
} else {
return num*factorial(num-1)
}
}
上面那個函數,當函數重命名之后,就函數就不能正確執行,解決辦法如下:
function factorial(num){
if(num<1){
return 1;
} else {
return num*arguments.callee(num-1)
}
}
函數內部另外一個特殊的對象this
this引用的是函數據以執行的環境對象--或者也可以說是this值(當在網頁的全局作用域中調用函數時,this對象引用的就是window)例子如下:
window.color = "red";
var o = { color:"blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //"red"
o.sayColor = sayColor
o.sayColor(); // "blue"
當運行sayColor()時,函數的執行的環境對象為window對象。
當運行o.sayColor()時,函數的執行對象為o對象。
函數屬性和方法:
每個函數包含兩個屬性,length和prototype,其中length表示函數希望接收到的命名參數的個數。
prototype,對于引用類型而言,prototype是保存所有實例方法的真正所在。例如:toString()和valueOf();
每個函數都包含非繼承而來的兩個方法:apply()和call();
apply()和call()的真正強大的地方是可以擴充函數賴以運行的作用域:
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor();
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
ES5還定義了一個方法,叫做bind(),這個方法會創建一個函數的實例,其this值會被綁定到傳給bind()函數的值。例如:
window.color = "red";
var o = {color :"blue"}
function sayColor(){
alert(this.color);
}
var objectSaycolor = sayColor.bind(o);
objectSaycolor(); //"blue"