<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Flyingis

    Talking and thinking freely !
    Flying in the world of GIS !
    隨筆 - 156, 文章 - 16, 評(píng)論 - 589, 引用 - 0
    數(shù)據(jù)加載中……

    ECMAScript 基礎(chǔ)

    ??? 作者: Flyingis

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

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

    ??? 原始數(shù)據(jù)類(lèi)型
    ?
    ??? ECMAScript原始數(shù)據(jù)類(lèi)型有五種:Undefined、Null、Boolean、Number、String。

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

    ??? 數(shù)據(jù)轉(zhuǎn)換
    ?
    ??? 在不同數(shù)據(jù)類(lèi)型之間轉(zhuǎn)換是任何一門(mén)編程語(yǔ)言的一個(gè)重要特性,ECMAScript提供了一系列簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)換,大多數(shù)數(shù)據(jù)類(lèi)型都提供了簡(jiǎn)單的轉(zhuǎn)換方法,對(duì)于復(fù)雜的轉(zhuǎn)換則有一些全局方法來(lái)完成,不管是哪一種方法,ECMAScript中數(shù)據(jù)轉(zhuǎn)換都非常簡(jiǎn)單。

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

    ??? Type Casting

    ??? ECMAScript數(shù)據(jù)類(lèi)型的轉(zhuǎn)換通常可以通過(guò)三個(gè)方法來(lái)實(shí)現(xiàn):Boolean(value)、Number(value)和String(value),這樣通常會(huì)產(chǎn)生一些非預(yù)期的結(jié)果。

    ??? 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()能實(shí)現(xiàn)所有類(lèi)型數(shù)據(jù)的直接轉(zhuǎn)換,和使用toString()不同的是,String()能夠?qū)ull或undefined數(shù)據(jù)轉(zhuǎn)換為string。

    ??? 引用類(lèi)型

    ??? ECMAScript 實(shí)際上并沒(méi)有傳統(tǒng)意義上的類(lèi),只是通過(guò)定義對(duì)象來(lái)等同于其他語(yǔ)言中的類(lèi),這一點(diǎn)我還比較含糊,以后可能會(huì)明白,在文中還是以“類(lèi)”來(lái)說(shuō)明。

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

    ??? 以上定義了一個(gè)Object對(duì)象的實(shí)例,這種語(yǔ)法和Java比較類(lèi)似。當(dāng)有參數(shù)的時(shí)候需要括號(hào)來(lái)引用,當(dāng)不存在參數(shù)時(shí),括號(hào)可以去掉。由于ECMAScript語(yǔ)言比較松散,不管是前面所屬的基礎(chǔ)語(yǔ)法,還是后面將提到的語(yǔ)法知識(shí),我們都應(yīng)該盡量按照一定的書(shū)寫(xiě)規(guī)范來(lái)約定自己的代碼格式,而不應(yīng)充分發(fā)揮語(yǔ)言松散的特點(diǎn)。

    ??? Object類(lèi)

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

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

    ??? Object 類(lèi)擁有的方法:

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

    ??? Boolean類(lèi)

    ??? 定義方法var ob = new Boolean(true); ob是Boolean原始數(shù)據(jù)類(lèi)型的一個(gè)引用。在使用Boolean對(duì)象過(guò)程中,需要注意,所有的對(duì)象會(huì)自動(dòng)轉(zhuǎn)變?yōu)閠rue,因此var ob1 = new Boolean(false);? var ob2 = ob1 && true; 最后ob2的值是true,非false。一般情況下,使用Boolean原始數(shù)據(jù)類(lèi)型可以避免這種情況。

    ??? Number類(lèi)

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

    ??? Number類(lèi)有一些為數(shù)字類(lèi)型的值特別設(shè)計(jì)的方法:

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

    ??? 在無(wú)法確定使用 toFixed 還是 toExponential 的時(shí)候,可以使用 toPrecision 方法來(lái)獲得取值:

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

    ??? String類(lèi)

    ??? String類(lèi)是一種復(fù)雜引用類(lèi)型,這里僅列出一些常見(jiàn)的方法,其中不少都是模仿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類(lèi)的方法同樣可以用于String原始數(shù)據(jù)類(lèi)型,因?yàn)樗莻螌?duì)象。

    ??? instanceof

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

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

    ??? 操作符和語(yǔ)句

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

    ??? Functions

    ??? Functions是ECMAScript的核心,在任何時(shí)候任何地方都可以運(yùn)行的一組代碼語(yǔ)句。

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

    ??? 當(dāng)function沒(méi)有返回值或return語(yǔ)句后沒(méi)有值的時(shí)候,該function實(shí)際上會(huì)被系統(tǒng)定義為undefined,當(dāng)function返回值的時(shí)候,function可以不必明確指定為某種數(shù)據(jù)類(lèi)型。

    ??? 關(guān)于重載

    ??? 重載是面向?qū)ο笳Z(yǔ)言的基本特性之一,但 ECMAScript 的 functions 并不能重載,在同一范圍里可以定義兩個(gè)完全相同的函數(shù),在調(diào)用函數(shù)的時(shí)候,最后的一個(gè)函數(shù)發(fā)揮作用。這種特性比較麻煩,但可以通過(guò) arguments 對(duì)象來(lái)實(shí)現(xiàn)和重載類(lèi)似的功能。

    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

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

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

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

    ??? 可以看出,是調(diào)用了最后的一個(gè)function使得數(shù)據(jù)結(jié)果為25,如果使用Function類(lèi)來(lái)定義以上兩個(gè)函數(shù),那為什么會(huì)使用最后的一個(gè)function可能會(huì)更明確一些。

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

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

    ??? 和Function類(lèi)相關(guān)的屬性、方法有許多,例如length、toString()、valueOf()等等。其中toString()在調(diào)試程序中使用較多。

    posted on 2006-06-13 15:36 Flyingis 閱讀(3645) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): Web 客戶(hù)端技術(shù)

    評(píng)論

    # re: ECMAScript 基礎(chǔ)  回復(fù)  更多評(píng)論   

    原文:“在使用Boolean對(duì)象過(guò)程中,需要注意,所有的對(duì)象會(huì)自動(dòng)轉(zhuǎn)變?yōu)閠rue,因此var ob1 = new Boolean(false); var ob2 = ob1 && true; 最后ob2的值是true,非false。”

    我寫(xiě)了下面的一段代碼:

    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));

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

    下面的代碼只是為了進(jìn)一步證實(shí)這個(gè)現(xiàn)象而以
    ob3 = fasle (正常)
    ob2&&ob3 = fasle (結(jié)果與ob3的值相等)
    ob3&&ob2 = true (結(jié)果與ob2的值相等)

    所以我認(rèn)為 待求結(jié)果的值與操作符“&&”后面的值相等。
    我上網(wǎng)查了一下,很多人和你說(shuō)的一樣,所有的對(duì)象會(huì)自動(dòng)轉(zhuǎn)變?yōu)閠rue,之后就沒(méi)有進(jìn)一步細(xì)講了。
    為什么會(huì)出現(xiàn)上面的現(xiàn)象,我有點(diǎn)不太明白了。
    希望告知,謝謝啦^+^

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

    # re: ECMAScript 基礎(chǔ)  回復(fù)  更多評(píng)論   

    呵呵,問(wèn)題已經(jīng)解決了

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

    # 這是書(shū)上摘抄的吧  回復(fù)  更多評(píng)論   

    好眼熟,仔細(xì)一看,原來(lái)就是《javascript高級(jí)程序設(shè)計(jì)》里的,呵呵……
    2006-10-31 10:58 | 笨笨狗

    # re: ECMAScript 基礎(chǔ)  回復(fù)  更多評(píng)論   

    @笨笨狗
    http://www.tkk7.com/flyingis/archive/2006/06/11/51947.html
    這里說(shuō)過(guò)初學(xué)時(shí)參考了Nicholas C.Zakas的《Professional JavaScript for Web Developers》,不想看書(shū)里長(zhǎng)篇大論的英文可以看看本文歸納的筆記,不足之處可以相互討論。不知道《JavaScript高級(jí)程序設(shè)計(jì)》和這本書(shū)有什么關(guān)系。
    2006-10-31 14:20 | Flyingis
    主站蜘蛛池模板: 24小时日本韩国高清免费| 亚洲国产精华液2020| 亚洲日本在线看片| 亚洲色偷偷偷鲁综合| 国产精品国产亚洲精品看不卡| 中文字幕亚洲一区二区三区| 日本亚洲国产一区二区三区 | 污网站在线免费观看| 精品久久久久久亚洲综合网| 亚洲.国产.欧美一区二区三区| 亚洲heyzo专区无码综合| 亚洲国产精品无码久久98 | 亚洲日韩aⅴ在线视频| 亚洲精品乱码久久久久久中文字幕| 激情97综合亚洲色婷婷五| 亚洲国产美女精品久久久久∴| 亚洲国产综合精品中文第一区| 久久青青草原亚洲av无码app | 亚洲av无码成人精品区| 亚洲精品亚洲人成在线观看下载 | 国产精品免费网站| 无码一区二区三区免费视频| 成人黄页网站免费观看大全| 国产猛烈高潮尖叫视频免费| JLZZJLZZ亚洲乱熟无码| 亚洲av综合色区| 亚洲成AV人综合在线观看 | 久久精品亚洲综合专区| 亚洲国产精品综合久久久| 最新亚洲春色Av无码专区| 在线播放亚洲精品| 成人免费乱码大片A毛片| 日韩电影免费在线观看中文字幕| 永久在线观看www免费视频| 成年男女男精品免费视频网站| 国产国产人免费人成免费视频| JLZZJLZZ亚洲乱熟无码| 7777久久亚洲中文字幕蜜桃| 亚洲日韩一区精品射精| 一个人免费观看www视频| 四虎影视成人永久免费观看视频 |