?開始讀《JAVASCRIPT高級程序設(shè)計》
第2章 ECMAScript基礎(chǔ)
JavaScript實質(zhì)上是ECMAScript在web環(huán)境中的實現(xiàn),還有其他實現(xiàn)(如Flash的ActionScript等)。因此了解基本的ECMAScript相當于掌握javascript的基礎(chǔ)。
1。ECMAScript的基礎(chǔ)概念:
1)區(qū)分大小寫
2)變量是弱類型(解釋型語言的基本特點)
3)每行結(jié)尾的分號可有可無(與java不同)
4)注釋的形式與java相同(單行或者塊注釋)
5)大括號代表代碼塊{}
2。變量,使用var定義。如var test="test1"
當然,變量是弱類型,并且可以不被初始化而定義
var test="test1"
var test2;
test=1;
建議采用匈牙利類型標記法來命名變量。
3.關(guān)鍵字和保留字(略)
4。原始值和引用值
與java類似,變量分成原始類型與引用類型兩類:
1)原始值存儲在stack中
2)引用值是存儲在heap中的對象,存儲在變量處的是一個point
5。原始類型:
1)ECMAScript有5種原始類型:Undefined、Null、Boolean、Number和String。可以使用typeof來判斷一個值是否在某類型的范圍內(nèi)。如:
var?s="test";
alert(typeof?s)??//輸出"string"

注意:type null返回object,因為null被認為是對象的占位符。
2)Undefined類型
當變量未初始化時,該變量的默認值就是undefined。但是,undefined并不同于未定義的值。但是,typeof并不區(qū)分兩者,比如:
var?temp1;
alert(typeof?temp1);??//未初始化,輸出undefined
alert(typeof?temp2);???//未定義,也是undefined函數(shù)無返回值,返回的也是undefined
3)Null類型
Null只有一個值,也就是null。Undefined本質(zhì)上是從Null派生來的,因此兩者相等:
alert(null==undefined);? //輸出true
但兩者意義不同,Undefined表示變量未被初始化之前的值,而Null則表示尚未存在的對象,也就是對象的占位符。
4)Boolean類型
Boolean有兩個值:true,false
5)Number類型
Number類型很有趣,Number可以表示32位的數(shù)字,也可以表示64位的浮點數(shù),以0開頭的數(shù)字當成八進制,以ox開頭即為十六進制。有趣的地方在于所有數(shù)字運算結(jié)果都是返回十進制!
在ECMAScript中,浮點數(shù)的計算本質(zhì)上是存儲的是字符串。
Number類型的大小在Number.MAX_VALUE和Number.MIN_VALUE之間
無窮大用Infinity表示,如你所見,Number.MAX_VALUE就是Infinity,而Number.MIN_VALUE就是-Infinity,可以通過isFinite(n)來判斷n是否超過界限
最后,還有一個特殊值是NaN,表示Not a Number(非數(shù)),非數(shù)產(chǎn)生在類型轉(zhuǎn)換失敗時,注意,它與自身不相當:alert(NaN==NaN);? //輸出false
不推薦使用NaN,我們可以通過isNaN()來判斷是否是非數(shù)(很常用咯)
6) String類型
String是唯一沒有固定大小的原始類型,可以存儲0或者多個Unicode字符。與java不同的是,可以使用雙引好和單引號來聲明字符:
var s1="test1";
var s2='test2';
常見轉(zhuǎn)義符與其他語言相同。
6。類型轉(zhuǎn)換
1)轉(zhuǎn)換成字符串:
Boolean,String和Number類型本質(zhì)上都是偽對象,他們都有toString()方法(與java相同)
Number類型的toString()有兩種模式:
toString(),返回數(shù)字的十進制
toString(n),返回n進制的字符串(n為2,8,10,16)
2)轉(zhuǎn)換成數(shù)字:
兩個方法:parseInt()和parseFloat()方法。用法略過,需要注意的是parseInt如果沒指定基數(shù),會把以0開始的解析為8進制。parseFloat反而不會。
3)強制類型轉(zhuǎn)換:
3種強制類型轉(zhuǎn)換:
String(value);
Boolean(value);
Number(value);
規(guī)則如下:
(1)String(value)與toString()基本一樣,除了對null或者undefined的轉(zhuǎn)換之外,如:
var s1=String(null); //通過
var oNull=null;
var s2=oNull.toString(); //報錯
(2)Boolean(value),如果該value是空字符串、數(shù)字0、undefined或者null,返回false,其他返回true
(3)Number()與parseInt和parseFloat基本相同,不同的是Number()將轉(zhuǎn)換整體,如果轉(zhuǎn)換失敗返回NaN。如:
Number(false)??;//??0
Number(true);??//???1
Number(new?Object());???//??NaN
Number('5.6.7');????//??NaN7。引用類型:
1)Object類:類似于java中java.lang.Object的地位和作用,js中所有類都繼承此類而來。它包含下面的屬性:
(1)Constructor——對創(chuàng)建該對象函數(shù)的引用
(2)Prototype——對該對象對象原型的引用,對所有的類,它將返回一個Object實例
(3)HasOwnProperty(property)——判斷是否有某個屬性
(4)IsPropertOf(object)——判斷該對象是否為另一個對象的原型
(5)PropertyIsEnumerable(property)——判斷對象的屬性是否可以枚舉
(6)ToString()——返回對象的原始字符串表示
(7)ValueOf()——返回最適合該對象的原始值,對于許多類,它的結(jié)果與ToString()相同
2)Boolean類,盡量避免使用,注意的是,在Boolean表達式中,所有的值將被自動轉(zhuǎn)化為true,所以下面的輸出:
var oFalseObject=new Boolean(false);
alert(oFalseObject&&true);? //輸出true,而不是false
3) Number類,是Number原始類型的引用類型,應(yīng)該少使用此類,盡量使用原始類型。需要注意3個方法:
(1)toFixed():返回具有指定位數(shù)小數(shù)的字符串,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toFixed(2));? // 輸出99.00
?(2) toExponential(),返回用科學記數(shù)法表示的數(shù)字的字符串形式,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toExponential(1));? //輸出9.9e+1
(3)toPrecision(),對數(shù)進行舍入,返回盡可能接近真實值的數(shù)字,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toPrecision(3));? //輸出99.0
注意,這3個方法都將進行四舍五入操作
4)String類,是String原始類型的對象,常見方法見下面的例子:
var?oStringObject=new?String("hello?world");
alert(oStringObject.length);??//輸出11
alert(oStringObject.toString()==oStringObject.valueOf());??//輸出true
alert(oStringObject.charAt(1));???//輸出e
alert(oStringObject.charCodeAt(1));?//輸出e的字符代碼:101
alert(oStringObject.concat(",china"));???//輸出hello?world,china
alert(oStringObject.indexOf("e"));???//輸出1
alert(oStringObject.lastIndexOf("o"));??//輸出7

var?oStringObject1=new?String("yellow");
var?oStringObject2=new?String("brick");
var?iResult=oStringObject1.localeCompare(oStringObject2);??//根據(jù)本地比較

if(iResult>0)
{
??alert("oStringObject1在oStringObject2后面");

}else?if(iResult<0)
{
???alert("oStringObject1在oStringObject2前面");
}else
???alert("oStringObject1和oStringObject2相同");
alert(oStringObject.substring(3,7));??//輸出"lo?w"
alert(oStringObject.slice(3,7));??//輸出"lo?w"
alert(oStringObject.toUpperCase());
alert(oStringObject.toLowerCase());
alert("中國".toLocaleLowerCase());8.操作符和語句,省略大部分操作符的介紹和控制語句,與其他語言(java,ruby)基本相同,需要注意的摘抄如下:
1)delete操作符:用于刪除對以前定義的對象屬性或者方法的引用,如:
var?o=new?Object();
o.name="dennis";
alert(o.name);?//輸出dennis
delete?o.name;???//解除引用
alert(o.name);??//輸出undifined2)for ... in語句,嚴格的枚舉語句,用于枚舉對象屬性
3)switch可以作用于字符串,而不僅僅是整數(shù)
4)不支持重載(與ruby相同),可以通過arguments對象來變相實現(xiàn)
5)在ECMAScript中,函數(shù)其實是完整一個對象(與ruby相同,或者說動態(tài)語言的基本特點),可以采用:
var function_name=new Function(arg1,arg2,arg3,...,function_body);
來定義函數(shù)(速度比普通方法慢)。函數(shù)可以作為參數(shù)傳遞,函數(shù)的length屬性返回此函數(shù)的參數(shù)個數(shù)
6)ECMAScript的閉包概念與其他動態(tài)語言的概念很不同,我還不大理解,過段時間好好研究一下。(寫入備忘錄)