Flyingis

          Talking and thinking freely !
          Flying in the world of GIS !
          隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0
          數據加載中……

          ECMAScript 基礎

          ??? 作者: Flyingis

          ??? JavaScript的核心之一ECMAScript的語言特性和Java、C、Perl都有許多相似之處,其中不少特性都是從這些語言借鑒而來,同時它們之間也存在許多差異。下面列舉一些ECMAScript的基本特性。

          ??? --和Java一樣,ECMAScript區分大小寫,注釋的格式相同,通過{}確定代碼塊,原始數據類型存儲在堆棧,對象的引用存儲在堆中
          ??? --ECMAScript是一種松散的語言,ECMAScript通過var操作符聲明變量,并且不限類型,例如var n = 25,那么n就是數字類型,var n = "string" ,那么n就是String類型
          ??? --在每一行代碼后,可以不寫分號,ECMAScript自動認為該行的末尾為該行代碼的最后;ECMAScript中的變量可以不用初始化,在幕后系統將自動完成初始化操作
          ??? --同一變量可以賦予不同類型的數據;變量的第一個字符只能是字母、下劃線或$ ,其他的字符可以是下劃線、$、或任意的字母、數字、字符
          ??? --和其他語言一樣,變量最好遵循駝峰書寫法,或Pascal表示法、或匈牙利表示法
          ??? --和大多數語言不同的是, ECMAScript 變量在使用之前可以不必聲明,系統會自動將該變量聲明為全局變量,例如var m =
          " Good " ; n = m + " Morning " ; alert(n)輸出結構是 " Good Morning "
          ??? --在大多數語言里,String是對象,在ECMAScript中卻是原始數據類型

          ??? 原始數據類型
          ?
          ??? ECMAScript原始數據類型有五種:Undefined、Null、Boolean、Number、String。

          ??? typeof—判斷變量和值的數據類型,通常有undefined、boolean、number、string、object五種類型。
          ??? Undefined—當變量被聲明但沒有初始化,或函數沒有明確返回一個值的時候,該變量或函數即為 Undefined 類型。
          ??? Null—undefined是null的一種派生,當代表一個對象的值不存在時,該對象返回null。
          ??? Boolean—包含兩個值,true and false , false不等于0,但0可以轉換為false 。
          ??? Number—可以定義32位整型數據或64位浮點型數據。定義數字類型變量時,在數字前加0即為八進制,加0x為十六進制,它們計算后返回的結果統一為十進制。通過var f = 1.0可以定義一個浮點類型變量,有意思的是,當f被用于計算之前,它實際是以 String類型存儲的。當浮點類型數據很大或很小時(可以前后移動六位),將使用E表示法來表示浮點數據,最大可以存儲17位數據。另外,isFinite()方法可以判斷一個數值是否有限,isNaN()方法可以判斷一個數據是非數字類型。
          ??? String—String在ECMAScript中是原始數據類型,并且是唯一沒有空間大小限制的數據類型。和Java不同的是,var s =
          " javascript " 和var s = 'javascript'均是合法的表示方法。

          ??? 數據轉換
          ?
          ??? 在不同數據類型之間轉換是任何一門編程語言的一個重要特性,ECMAScript提供了一系列簡單的方法來實現數據的轉換,大多數數據類型都提供了簡單的轉換方法,對于復雜的轉換則有一些全局方法來完成,不管是哪一種方法,ECMAScript中數據轉換都非常簡單。

          ??? Boolean、number和string數據類型是原始數據類型,但它們同時是偽對象(在ECMAScript中偽對象到底該怎么解釋,運行機制如何還不清楚?有人知道請給予解答),擁有自己的屬性和方法,可以通過toString()方法來實現string類型的轉換。ECMAScript定義所有的對象,不管是偽對象還是真實的對象,都可以實現toString()方法,string被列為偽對象的行列,自然也擁有toString()方法。將數字類型數據轉換為string的時候,可以在 toString() 方法中加入2、8、16參數,來實現不同進制的數據輸出,例如var n = 10; alert(n.toString(2))輸出為1010,alert(n.toString(8))輸出為12,n.toString()和n.toString(10)相同。
          ?
          ??? ECMAScript提供了兩種方法來實現string類型轉化為數字類型的方法:parseInt()和parseFloat()。其他類型轉換將會返回 NaN(Not a Number)。

          ??? Type Casting

          ??? ECMAScript數據類型的轉換通常可以通過三個方法來實現:Boolean(value)、Number(value)和String(value),這樣通常會產生一些非預期的結果。

          ??? Boolean

          var?b1 = Boolean( "" );? // false–empty?string
          var?b2 = Boolean( " hi " );? // true–non-empty?string
          var?b3 = Boolean( 100 );? // true–non-zero?number
          var?b4 = Boolean( null );? // false-null
          var?b5 = Boolean( 0 );? // false-zero
          var?b6 = Boolean( new Object());? // true–object

          ??? Number

          Number( false )? 0
          Number(
          true ) ? 1
          Number(undefined)?NaN
          Number(
          null )? 0
          Number(
          " 5.5 " )? 5.5
          Number(
          " 56 " )? 56
          Number(
          " 5.6.7 " )?NaN
          Number(
          new
          Object())?NaN
          Number(
          100 )? 100

          ??? String

          ??? String()能實現所有類型數據的直接轉換,和使用toString()不同的是,String()能夠將null或undefined數據轉換為string。

          ??? 引用類型

          ??? ECMAScript 實際上并沒有傳統意義上的類,只是通過定義對象來等同于其他語言中的類,這一點我還比較含糊,以后可能會明白,在文中還是以“類”來說明。

          var ?ob? = ? new ?Object();

          ??? 以上定義了一個Object對象的實例,這種語法和Java比較類似。當有參數的時候需要括號來引用,當不存在參數時,括號可以去掉。由于ECMAScript語言比較松散,不管是前面所屬的基礎語法,還是后面將提到的語法知識,我們都應該盡量按照一定的書寫規范來約定自己的代碼格式,而不應充分發揮語言松散的特點。

          ??? Object類

          ??? Object類和Java里的java.lang.Object類比較相似,它是ECMAScript中其他所有類的基類,它具有如下屬性:

          ??? constructor—建立對象的函數的一個引用,對于Object類而言,該引用指向本地Object()方法。
          ??? prototype—對象里prototype對象的一個引用值。

          ??? Object 類擁有的方法:

          ??? hasOwnProperty(property)—判斷property屬性是否存在于對象中,property數據類型為string
          ??? isPrototypeOf(object)— 判斷一個對象是否是另一對象的 prototype
          ??? propertyIsEnumerable(property)— 判斷所給出的屬性能否使用 for 語句列舉出來
          ??? toString()—返回對象的原始類型string
          ??? valueOf()—返回對象合適的原始值,對于多數類而言,返回的值和toString()相同
          ??? Object類的每一個屬性和方法都被其他的類所重寫

          ??? Boolean類

          ??? 定義方法var ob = new Boolean(true); ob是Boolean原始數據類型的一個引用。在使用Boolean對象過程中,需要注意,所有的對象會自動轉變為true,因此var ob1 = new Boolean(false);? var ob2 = ob1 && true; 最后ob2的值是true,非false。一般情況下,使用Boolean原始數據類型可以避免這種情況。

          ??? Number類

          ??? 定義方法var o = new Number(15);
          ??? 獲得原始數據的值var n = o.valueOf();

          ??? Number類有一些為數字類型的值特別設計的方法:

          alert(o.toFixed( 2 ));?? // 輸出15.00
          alert(o.toExponential( 1 ));?? // 輸出1.5e+1

          ??? 在無法確定使用 toFixed 還是 toExponential 的時候,可以使用 toPrecision 方法來獲得取值:

          alert(o.toPrecision( 1 ));?? // 輸出?2e+1
          alert(o.toPrecision( 2 ));?? // 輸出?15
          alert(o.toPrecision( 3 ));?? // 輸出?15.0

          ??? String類

          ??? String類是一種復雜引用類型,這里僅列出一些常見的方法,其中不少都是模仿java.lang.String:

          var ?s? = ? new ?String( " Good?Morning " );
          alert(s.valueOf()?
          == ?s.toString());?? // 輸出true

          alert(s.length);?? // 輸出12
          alert(s.charAt( 1 ));?? // 輸出o
          var ?sr? = ?s.concat( " ?! " );?alert(sr);?? // 輸出Good?morning?!
          alert(s.indexOf( " o " );?? // 輸出1
          alert(s.lastIndexOf( " o " );?? // 輸出6
          alert(s.localeCompare(Good?morning));?? // 輸出0
          alert(s.localeCompare(Apple));?? // 輸出1
          alert(s.localeCompare(House));?? // 輸出-1
          alert(s.slice( 2 ));?? // ?輸出od?morning
          alert(s.substring( 2 ));?? // ?輸出od?morning
          alert(s.slice( 2 ,? - 5 ));?? // ?輸出od?mo
          alert(s.substring( 2 ,? - 5 ));?? // 輸出Go
          alert(s.toUpperCase());?? // 輸出GOOD?MORNING
          alert(s.toLowerCase());?? // 輸出good?morning

          ??? 另外,所有String類的方法同樣可以用于String原始數據類型,因為它是偽對象。

          ??? instanceof

          ??? instanceof操作符和typeof作用類似,不同的是,instanceof需要明確指定對象是否屬于某種特定類型。例如

          var ?s? = ? new ?String( " Good?morning?! " );
          alert(s?
          instanceof ?String);

          ??? 操作符和語句

          ??? ECMAScript 中大多數操作符、語句和 Java 都比較類似,但也有一些其特有的,如 label 語句, with 語句, for-in 語句等等。

          ??? Functions

          ??? Functions是ECMAScript的核心,在任何時候任何地方都可以運行的一組代碼語句。

          function ?functionName(arg0,?arg1,?……?,?argN)? {
          ??statements
          }

          ??? 當function沒有返回值或return語句后沒有值的時候,該function實際上會被系統定義為undefined,當function返回值的時候,function可以不必明確指定為某種數據類型。

          ??? 關于重載

          ??? 重載是面向對象語言的基本特性之一,但 ECMAScript 的 functions 并不能重載,在同一范圍里可以定義兩個完全相同的函數,在調用函數的時候,最后的一個函數發揮作用。這種特性比較麻煩,但可以通過 arguments 對象來實現和重載類似的功能。

          function ?func()? {
          ??
          if (arguments.length? == ? 1 )?
          {
          ????alert(arguments[
          0 ]? + ? 5
          );
          ??}
          ? else ? if ?(arguments.length? == ? 2 )? {
          ??????alert(arguments[
          0 ]? + ?arguments[ 1
          ]);
          ????}

          }


          func(
          5 );?? // 輸出10
          func( 10 ,? 15 );?? // 輸出25

          ??? 前面提到過,在同一范圍里可以定義兩個完全相同的function,在調用function的時候,最后的一個function發揮作用。
          ?
          function ?func(i)? {
          ??alert(i?
          + ? 10
          );
          }

          function ?func(i)? {
          ??alert(i?
          + ? 20
          );
          }

          func(
          5 );?? // 輸出25

          ??? 可以看出,是調用了最后的一個function使得數據結果為25,如果使用Function類來定義以上兩個函數,那為什么會使用最后的一個function可能會更明確一些。

          var ?func? = ? new ?Function(“i”,?“alert(i? + ? 10 )”);
          var ?func? = ? new ?Function(“i”,?“alert(i? + ? 20
          )”);
          func(
          5 );

          ??? func指向了另外一個引用,從而值發生了改變,func是作為function對象的引用而存在的,并且允許兩個變量指向同一個 function。

          ??? 和Function類相關的屬性、方法有許多,例如length、toString()、valueOf()等等。其中toString()在調試程序中使用較多。

          posted on 2006-06-13 15:36 Flyingis 閱讀(3647) 評論(4)  編輯  收藏 所屬分類: Web 客戶端技術

          評論

          # re: ECMAScript 基礎  回復  更多評論   

          原文:“在使用Boolean對象過程中,需要注意,所有的對象會自動轉變為true,因此var ob1 = new Boolean(false); var ob2 = ob1 && true; 最后ob2的值是true,非false。”

          我寫了下面的一段代碼:

          var ob1 = new Boolean(false);
          var ob2 = ob1&&true;
          var ob3 = new Boolean();
          var ob4 = true&&ob1;
          alert("ob1 = " + ob1 + " ob2 = ob1&&true = " +ob2 +
          " ob4 = true&&ob1 = "+ob4 + " ob3 = " + ob3 +
          " ob2&&ob3 = " + (ob2&&ob3) + " ob3&&ob2 = " + (ob3&&ob2));

          結果:
          ob1 = false (正常)
          ob2 = ob1&&true = true (和你說的一樣)
          ob4 = true&&ob1 = false (我只是改變了順序,為什么結果完全相反呢?既然都轉換為true為什么結果為false)

          下面的代碼只是為了進一步證實這個現象而以
          ob3 = fasle (正常)
          ob2&&ob3 = fasle (結果與ob3的值相等)
          ob3&&ob2 = true (結果與ob2的值相等)

          所以我認為 待求結果的值與操作符“&&”后面的值相等。
          我上網查了一下,很多人和你說的一樣,所有的對象會自動轉變為true,之后就沒有進一步細講了。
          為什么會出現上面的現象,我有點不太明白了。
          希望告知,謝謝啦^+^

          2006-10-30 17:30 | 馬嘉楠

          # re: ECMAScript 基礎  回復  更多評論   

          呵呵,問題已經解決了

          http://www.aygfsteel.com/majianan/archive/2006/10/30/78177.html
          2006-10-31 01:20 | 馬嘉楠

          # 這是書上摘抄的吧  回復  更多評論   

          好眼熟,仔細一看,原來就是《javascript高級程序設計》里的,呵呵……
          2006-10-31 10:58 | 笨笨狗

          # re: ECMAScript 基礎  回復  更多評論   

          @笨笨狗
          http://www.aygfsteel.com/flyingis/archive/2006/06/11/51947.html
          這里說過初學時參考了Nicholas C.Zakas的《Professional JavaScript for Web Developers》,不想看書里長篇大論的英文可以看看本文歸納的筆記,不足之處可以相互討論。不知道《JavaScript高級程序設計》和這本書有什么關系。
          2006-10-31 14:20 | Flyingis
          主站蜘蛛池模板: 慈溪市| 海门市| 东丰县| 图们市| 德兴市| 珠海市| 木里| 肥西县| 分宜县| 恩平市| 叙永县| 家居| 清苑县| 鸡泽县| 边坝县| 周宁县| 上高县| 晋宁县| 济源市| 崇礼县| 宁陕县| 徐汇区| 太谷县| 霍邱县| 林周县| 呼伦贝尔市| 库伦旗| 玉环县| 深水埗区| 东兰县| 东方市| 安龙县| 蒲城县| 银川市| 苍南县| 洞头县| 虎林市| 营口市| 东乌珠穆沁旗| 千阳县| 三亚市|