閱讀966 返回首頁    go 阿裏雲 go 技術社區[雲棲]


ECMAScript基礎

 開始讀《JAVASCRIPT高級程序設計》
第2章 ECMAScript基礎

JavaScript實質上是ECMAScript在web環境中的實現,還有其他實現(如Flash的ActionScript等)。因此了解基本的ECMAScript相當於掌握javascript的基礎。

1。ECMAScript的基礎概念:
1)區分大小寫
2)變量是弱類型(解釋型語言的基本特點)
3)每行結尾的分號可有可無(與java不同)
4)注釋的形式與java相同(單行或者塊注釋)
5)大括號代表代碼塊{}

2。變量,使用var定義。如var test="test1"
當然,變量是弱類型,並且可以不被初始化而定義
var test="test1"
var test2;
test=1;
建議采用匈牙利類型標記法來命名變量。

3.關鍵字和保留字(略)

4。原始值和引用值
與java類似,變量分成原始類型與引用類型兩類:
1)原始值存儲在stack中
2)引用值是存儲在heap中的對象,存儲在變量處的是一個point

5。原始類型:
1)ECMAScript有5種原始類型:Undefined、Null、Boolean、Number和String。可以使用typeof來判斷一個值是否在某類型的範圍內。如:
None.gifvar s="test";
None.gifalert(
typeof s)  //輸出"string"
None.gif

注意:type null返回object,因為null被認為是對象的占位符。

2)Undefined類型
當變量未初始化時,該變量的默認值就是undefined。但是,undefined並不同於未定義的值。但是,typeof並不區分兩者,比如:
None.gifvar temp1;
None.gifalert(
typeof temp1);  //未初始化,輸出undefined
None.gif
alert(typeof temp2);   //未定義,也是undefined


函數無返回值,返回的也是undefined

3)Null類型
Null隻有一個值,也就是null。Undefined本質上是從Null派生來的,因此兩者相等:
alert(null==undefined);  //輸出true
但兩者意義不同,Undefined表示變量未被初始化之前的值,而Null則表示尚未存在的對象,也就是對象的占位符。

4)Boolean類型
Boolean有兩個值:true,false

5)Number類型
Number類型很有趣,Number可以表示32位的數字,也可以表示64位的浮點數,以0開頭的數字當成八進製,以ox開頭即為十六進製。有趣的地方在於所有數字運算結果都是返回十進製!
在ECMAScript中,浮點數的計算本質上是存儲的是字符串。
Number類型的大小在Number.MAX_VALUE和Number.MIN_VALUE之間
無窮大用Infinity表示,如你所見,Number.MAX_VALUE就是Infinity,而Number.MIN_VALUE就是-Infinity,可以通過isFinite(n)來判斷n是否超過界限

最後,還有一個特殊值是NaN,表示Not a Number(非數),非數產生在類型轉換失敗時,注意,它與自身不相當:alert(NaN==NaN);  //輸出false

不推薦使用NaN,我們可以通過isNaN()來判斷是否是非數(很常用咯)

6) String類型
String是唯一沒有固定大小的原始類型,可以存儲0或者多個Unicode字符。與java不同的是,可以使用雙引好和單引號來聲明字符:
var s1="test1";
var s2='test2';
常見轉義符與其他語言相同。

6。類型轉換
1)轉換成字符串:
Boolean,String和Number類型本質上都是偽對象,他們都有toString()方法(與java相同)

Number類型的toString()有兩種模式:
toString(),返回數字的十進製
toString(n),返回n進製的字符串(n為2,8,10,16)

2)轉換成數字:
兩個方法:parseInt()和parseFloat()方法。用法略過,需要注意的是parseInt如果沒指定基數,會把以0開始的解析為8進製。parseFloat反而不會。

3)強製類型轉換:
3種強製類型轉換:
String(value);
Boolean(value);
Number(value);
規則如下:
(1)String(value)與toString()基本一樣,除了對null或者undefined的轉換之外,如:
var s1=String(null); //通過
var oNull=null;
var s2=oNull.toString(); //報錯

(2)Boolean(value),如果該value是空字符串、數字0、undefined或者null,返回false,其他返回true

(3)Number()與parseInt和parseFloat基本相同,不同的是Number()將轉換整體,如果轉換失敗返回NaN。如:
None.gifNumber(false)  ;//  0
None.gif
Number(true);  //   1
None.gif
Number(new Object());   //  NaN
None.gif
Number('5.6.7');    //  NaN


7。引用類型:
1)Object類:類似於java中java.lang.Object的地位和作用,js中所有類都繼承此類而來。它包含下麵的屬性:
(1)Constructor——對創建該對象函數的引用
(2)Prototype——對該對象對象原型的引用,對所有的類,它將返回一個Object實例
(3)HasOwnProperty(property)——判斷是否有某個屬性
(4)IsPropertOf(object)——判斷該對象是否為另一個對象的原型
(5)PropertyIsEnumerable(property)——判斷對象的屬性是否可以枚舉
(6)ToString()——返回對象的原始字符串表示
(7)ValueOf()——返回最適合該對象的原始值,對於許多類,它的結果與ToString()相同

2)Boolean類,盡量避免使用,注意的是,在Boolean表達式中,所有的值將被自動轉化為true,所以下麵的輸出:
var oFalseObject=new Boolean(false);
alert(oFalseObject&&true);  //輸出true,而不是false

3) Number類,是Number原始類型的引用類型,應該少使用此類,盡量使用原始類型。需要注意3個方法:
(1)toFixed():返回具有指定位數小數的字符串,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toFixed(2));  // 輸出99.00

 (2) toExponential(),返回用科學記數法表示的數字的字符串形式,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toExponential(1));  //輸出9.9e+1

(3)toPrecision(),對數進行舍入,返回盡可能接近真實值的數字,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toPrecision(3));  //輸出99.0
注意,這3個方法都將進行四舍五入操作

4)String類,是String原始類型的對象,常見方法見下麵的例子:

None.gifvar oStringObject=new String("hello world");
None.gifalert(oStringObject.length);  
//輸出11
None.gif
alert(oStringObject.toString()==oStringObject.valueOf());  //輸出true
None.gif
alert(oStringObject.charAt(1));   //輸出e
None.gif
alert(oStringObject.charCodeAt(1)); //輸出e的字符代碼:101
None.gif
alert(oStringObject.concat(",china"));   //輸出hello world,china
None.gif
alert(oStringObject.indexOf("e"));   //輸出1
None.gif
alert(oStringObject.lastIndexOf("o"));  //輸出7
None.gif

None.gif
var oStringObject1=new String("yellow");
None.gif
var oStringObject2=new String("brick");
None.gif
var iResult=oStringObject1.localeCompare(oStringObject2);  //根據本地比較
ExpandedBlockStart.gifContractedBlock.gif
if(iResult>0)dot.gif{
InBlock.gif  alert(
"oStringObject1在oStringObject2後麵");
ExpandedBlockStart.gifContractedBlock.gif}
else if(iResult<0)dot.gif{
InBlock.gif   alert(
"oStringObject1在oStringObject2前麵");
ExpandedBlockEnd.gif}
else
None.gif   alert(
"oStringObject1和oStringObject2相同");
None.gifalert(oStringObject.substring(
3,7));  //輸出"lo w"
None.gif
alert(oStringObject.slice(3,7));  //輸出"lo w"
None.gif
alert(oStringObject.toUpperCase());
None.gifalert(oStringObject.toLowerCase());
None.gifalert(
"中國".toLocaleLowerCase());


8.操作符和語句,省略大部分操作符的介紹和控製語句,與其他語言(java,ruby)基本相同,需要注意的摘抄如下:
1)delete操作符:用於刪除對以前定義的對象屬性或者方法的引用,如:
None.gifvar o=new Object();
None.gifo.name
="dennis";
None.gifalert(o.name); 
//輸出dennis
None.gif
delete o.name;   //解除引用
None.gif
alert(o.name);  //輸出undifined



2)for ... in語句,嚴格的枚舉語句,用於枚舉對象屬性

3)switch可以作用於字符串,而不僅僅是整數

4)不支持重載(與ruby相同),可以通過arguments對象來變相實現

5)在ECMAScript中,函數其實是完整一個對象(與ruby相同,或者說動態語言的基本特點),可以采用:
var function_name=new Function(arg1,arg2,arg3,...,function_body);
來定義函數(速度比普通方法慢)。函數可以作為參數傳遞,函數的length屬性返回此函數的參數個數
6)ECMAScript的閉包概念與其他動態語言的概念很不同,我還不大理解,過段時間好好研究一下。(寫入備忘錄)

文章轉自莊周夢蝶  ,原文發布時間5.17

最後更新:2017-05-17 11:04:11

  上一篇:go  ECMAScript對象基礎
  下一篇:go  如何讓你的“門外漢”同事相信數據科學很有用?