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

注意:type null返回object,因?yàn)閚ull被認(rèn)為是對(duì)象的占位符。
2)Undefined類(lèi)型
當(dāng)變量未初始化時(shí),該變量的默認(rèn)值就是undefined。但是,undefined并不同于未定義的值。但是,typeof并不區(qū)分兩者,比如:
var?temp1;
alert(typeof?temp1);??//未初始化,輸出undefined
alert(typeof?temp2);???//未定義,也是undefined函數(shù)無(wú)返回值,返回的也是undefined
3)Null類(lèi)型
Null只有一個(gè)值,也就是null。Undefined本質(zhì)上是從Null派生來(lái)的,因此兩者相等:
alert(null==undefined);? //輸出true
但兩者意義不同,Undefined表示變量未被初始化之前的值,而Null則表示尚未存在的對(duì)象,也就是對(duì)象的占位符。
4)Boolean類(lèi)型
Boolean有兩個(gè)值:true,false
5)Number類(lèi)型
Number類(lèi)型很有趣,Number可以表示32位的數(shù)字,也可以表示64位的浮點(diǎn)數(shù),以0開(kāi)頭的數(shù)字當(dāng)成八進(jìn)制,以ox開(kāi)頭即為十六進(jìn)制。有趣的地方在于所有數(shù)字運(yùn)算結(jié)果都是返回十進(jìn)制!
在ECMAScript中,浮點(diǎn)數(shù)的計(jì)算本質(zhì)上是存儲(chǔ)的是字符串。
Number類(lèi)型的大小在Number.MAX_VALUE和Number.MIN_VALUE之間
無(wú)窮大用Infinity表示,如你所見(jiàn),Number.MAX_VALUE就是Infinity,而Number.MIN_VALUE就是-Infinity,可以通過(guò)isFinite(n)來(lái)判斷n是否超過(guò)界限
最后,還有一個(gè)特殊值是NaN,表示Not a Number(非數(shù)),非數(shù)產(chǎn)生在類(lèi)型轉(zhuǎn)換失敗時(shí),注意,它與自身不相當(dāng):alert(NaN==NaN);? //輸出false
不推薦使用NaN,我們可以通過(guò)isNaN()來(lái)判斷是否是非數(shù)(很常用咯)
6) String類(lèi)型
String是唯一沒(méi)有固定大小的原始類(lèi)型,可以存儲(chǔ)0或者多個(gè)Unicode字符。與java不同的是,可以使用雙引好和單引號(hào)來(lái)聲明字符:
var s1="test1";
var s2='test2';
常見(jiàn)轉(zhuǎn)義符與其他語(yǔ)言相同。
6。類(lèi)型轉(zhuǎn)換
1)轉(zhuǎn)換成字符串:
Boolean,String和Number類(lèi)型本質(zhì)上都是偽對(duì)象,他們都有toString()方法(與java相同)
Number類(lèi)型的toString()有兩種模式:
toString(),返回?cái)?shù)字的十進(jìn)制
toString(n),返回n進(jìn)制的字符串(n為2,8,10,16)
2)轉(zhuǎn)換成數(shù)字:
兩個(gè)方法:parseInt()和parseFloat()方法。用法略過(guò),需要注意的是parseInt如果沒(méi)指定基數(shù),會(huì)把以0開(kāi)始的解析為8進(jìn)制。parseFloat反而不會(huì)。
3)強(qiáng)制類(lèi)型轉(zhuǎn)換:
3種強(qiáng)制類(lèi)型轉(zhuǎn)換:
String(value);
Boolean(value);
Number(value);
規(guī)則如下:
(1)String(value)與toString()基本一樣,除了對(duì)null或者undefined的轉(zhuǎn)換之外,如:
var s1=String(null); //通過(guò)
var oNull=null;
var s2=oNull.toString(); //報(bào)錯(cuò)
(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。引用類(lèi)型:
1)Object類(lèi):類(lèi)似于java中java.lang.Object的地位和作用,js中所有類(lèi)都繼承此類(lèi)而來(lái)。它包含下面的屬性:
(1)Constructor——對(duì)創(chuàng)建該對(duì)象函數(shù)的引用
(2)Prototype——對(duì)該對(duì)象對(duì)象原型的引用,對(duì)所有的類(lèi),它將返回一個(gè)Object實(shí)例
(3)HasOwnProperty(property)——判斷是否有某個(gè)屬性
(4)IsPropertOf(object)——判斷該對(duì)象是否為另一個(gè)對(duì)象的原型
(5)PropertyIsEnumerable(property)——判斷對(duì)象的屬性是否可以枚舉
(6)ToString()——返回對(duì)象的原始字符串表示
(7)ValueOf()——返回最適合該對(duì)象的原始值,對(duì)于許多類(lèi),它的結(jié)果與ToString()相同
2)Boolean類(lèi),盡量避免使用,注意的是,在Boolean表達(dá)式中,所有的值將被自動(dòng)轉(zhuǎn)化為true,所以下面的輸出:
var oFalseObject=new Boolean(false);
alert(oFalseObject&&true);? //輸出true,而不是false
3) Number類(lèi),是Number原始類(lèi)型的引用類(lèi)型,應(yīng)該少使用此類(lèi),盡量使用原始類(lèi)型。需要注意3個(gè)方法:
(1)toFixed():返回具有指定位數(shù)小數(shù)的字符串,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toFixed(2));? // 輸出99.00
?(2) toExponential(),返回用科學(xué)記數(shù)法表示的數(shù)字的字符串形式,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toExponential(1));? //輸出9.9e+1
(3)toPrecision(),對(duì)數(shù)進(jìn)行舍入,返回盡可能接近真實(shí)值的數(shù)字,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toPrecision(3));? //輸出99.0
注意,這3個(gè)方法都將進(jìn)行四舍五入操作
4)String類(lèi),是String原始類(lèi)型的對(duì)象,常見(jiàn)方法見(jiàn)下面的例子:
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("中國(guó)".toLocaleLowerCase());8.操作符和語(yǔ)句,省略大部分操作符的介紹和控制語(yǔ)句,與其他語(yǔ)言(java,ruby)基本相同,需要注意的摘抄如下:
1)delete操作符:用于刪除對(duì)以前定義的對(duì)象屬性或者方法的引用,如:
var?o=new?Object();
o.name="dennis";
alert(o.name);?//輸出dennis
delete?o.name;???//解除引用
alert(o.name);??//輸出undifined2)for ... in語(yǔ)句,嚴(yán)格的枚舉語(yǔ)句,用于枚舉對(duì)象屬性
3)switch可以作用于字符串,而不僅僅是整數(shù)
4)不支持重載(與ruby相同),可以通過(guò)arguments對(duì)象來(lái)變相實(shí)現(xiàn)
5)在ECMAScript中,函數(shù)其實(shí)是完整一個(gè)對(duì)象(與ruby相同,或者說(shuō)動(dòng)態(tài)語(yǔ)言的基本特點(diǎn)),可以采用:
var function_name=new Function(arg1,arg2,arg3,...,function_body);
來(lái)定義函數(shù)(速度比普通方法慢)。函數(shù)可以作為參數(shù)傳遞,函數(shù)的length屬性返回此函數(shù)的參數(shù)個(gè)數(shù)
6)ECMAScript的閉包概念與其他動(dòng)態(tài)語(yǔ)言的概念很不同,我還不大理解,過(guò)段時(shí)間好好研究一下。(寫(xiě)入備忘錄)