1.null和undefined
null是JavaScript的一個關鍵字,它表示空值。null可以看做是Object類型的一個特殊值,如果一個對象的值是null,其含義就是該對象不是一個有效的對象。
undefined不是JavaScript的關鍵字,它是一個全局變量,也就是Global對象的一個屬性值。在JavaScript中,有以下3種可能的情況會返回undefined:
(1) 使用了一個未定義的變量
(2)使用了已經定義但是沒有賦值的變量
(3)使用了一個對象的屬性,但是該屬性不存在或者未賦值
雖然undefined和null不同,但是運行下面的代碼會返回true
alert(undefined==null);
下面的代碼運行結果也會返回true
var v="";
alert(v.a==null);
alert(v.a==undefined);
這是因爲undefined和null都代表了值的缺失,所以在這裏他們是等值的。當然它們不是完全相等,因此下面的代碼會返回false
alert(undefined===null)
2.JS中的函數
JavaScript的Function對象在調用過程中具有一個arguments屬性,它是由腳本解釋器創建的(這也是創建arguments的惟一途徑)。arguments屬性可以看做是一個Array對象,它具有length屬性,可以通過序號訪問每一個參數,而且通過arguments的callee屬性可以獲取對只在執行的Function對象的引用。
callee屬性的應用
function factorial(n){
if(n<0){
return -1;
}else{
return n*arguments.callee(n-1);
}
}
alert(factorial(5));
例中的factorial函數實現了階乘的計算,它利用callee屬性完成了匿名的遞歸調用
Function對象的另一個屬性是caller,它指向正在調用當前函數的父函數對象。利用callee和caller屬性,可以很容易地實現對調用堆棧的遍歷。
3.apply和call方法
apply方法和call方法有相似之處,兩者都是將函數綁定到其他對象上執行的,區別在於調用參數的形式不同。調用apply和call方法的語法如下:
apply(thisObj[,argArray])
call(thisObj[,arg1[,arg2[,[,..argN]]]])
通過apply方法時,參數是通過Array對象傳入的;而通過call方法時,參數是一次給出的
function ClassA() {
this.prop="ClassA";
this.methodA=function(msg){
alert(this.prop+":"+msg);
}
}
function ClassB() {
this.prop ="ClassB";
this.methodB=function (msg) {
alert(this.prop+":"+msg);
}
}
var obj1=new ClassA();
var obj2=new ClassB();
obj1.methodA("msg1"); //輸出"ClassA:msg1";
obj2.methosB("msg2"); //輸出"ClassB:msg2";
obj1.methodA.apply(obj2,["msg1"]); //輸出“ClassB:msg1”;
obj2.methodB.apply(obj1,["msg2"]); //輸出"ClassA:msg2";
obj1.methodA.call(obj2,"msg1"); //輸出“ClassB:msg1”;
obj2.methodB.call(obj1,"msg2"); //輸出"ClassA:msg2"
4.this 和with 關鍵字
在JS中,this關鍵字常用於兩種地方:
(1) 在構造器函數中,指代新創建的對象實例;
(2) 在對象的方法被調用時,指代調用該方法的對象實例
如果一個函數被當做普通函數調用,那麼在函數中的this關鍵字將指向window對象。當然如果this關鍵字不在任何函數中,那麼它也指向window對象。
JS中的with關鍵字通常用來縮短特定情形下必須編寫的代碼量
如:
x =Math.cos(3*Math.PI) +Math.sin(Math.LN10);
y=Math.tan(14*Math.E);
當使用with語句時,代碼變得更短且易讀:
with(Math)
x=cos(3*PI)+sin(LN10);
y=tan(14*E);
5.FOR(.....in....)
使用其可以遍歷對象的所有屬性和方法
}