ECMAScript 基礎知識
更新時間:2007年06月29日 00:00:00 作者:
JavaScript的核心之一ECMAScript的語言特性和Java、C、Perl都有許多相似之處,其中不少特性都是從這些語言借鑒而來,同時它們之間也存在許多差異。下面列舉一些ECMAScript的基本特性。
--和Java一樣,ECMAScript區(qū)分大小寫,注釋的格式相同,通過{}確定代碼塊,原始數(shù)據(jù)類型存儲在堆棧,對象的引用存儲在堆中
--ECMAScript是一種松散的語言,ECMAScript通過var操作符聲明變量,并且不限類型,例如var n = 25,那么n就是數(shù)字類型,var n = "string" ,那么n就是String類型
--在每一行代碼后,可以不寫分號,ECMAScript自動認為該行的末尾為該行代碼的最后;ECMAScript中的變量可以不用初始化,在幕后系統(tǒng)將自動完成初始化操作
--同一變量可以賦予不同類型的數(shù)據(jù);變量的第一個字符只能是字母、下劃線或$ ,其他的字符可以是下劃線、$、或任意的字母、數(shù)字、字符
--和其他語言一樣,變量最好遵循駝峰書寫法,或Pascal表示法、或匈牙利表示法
--和大多數(shù)語言不同的是, ECMAScript 變量在使用之前可以不必聲明,系統(tǒng)會自動將該變量聲明為全局變量,例如var m = " Good " ; n = m + " Morning " ; alert(n)輸出結構是 " Good Morning "
--在大多數(shù)語言里,String是對象,在ECMAScript中卻是原始數(shù)據(jù)類型
原始數(shù)據(jù)類型
ECMAScript原始數(shù)據(jù)類型有五種:Undefined、Null、Boolean、Number、String。
typeof—判斷變量和值的數(shù)據(jù)類型,通常有undefined、boolean、number、string、object五種類型。
Undefined—當變量被聲明但沒有初始化,或函數(shù)沒有明確返回一個值的時候,該變量或函數(shù)即為 Undefined 類型。
Null—undefined是null的一種派生,當代表一個對象的值不存在時,該對象返回null。
Boolean—包含兩個值,true and false , false不等于0,但0可以轉換為false 。
Number—可以定義32位整型數(shù)據(jù)或64位浮點型數(shù)據(jù)。定義數(shù)字類型變量時,在數(shù)字前加0即為八進制,加0x為十六進制,它們計算后返回的結果統(tǒng)一為十進制。通過var f = 1.0可以定義一個浮點類型變量,有意思的是,當f被用于計算之前,它實際是以 String類型存儲的。當浮點類型數(shù)據(jù)很大或很小時(可以前后移動六位),將使用E表示法來表示浮點數(shù)據(jù),最大可以存儲17位數(shù)據(jù)。另外,isFinite()方法可以判斷一個數(shù)值是否有限,isNaN()方法可以判斷一個數(shù)據(jù)是非數(shù)字類型。
String—String在ECMAScript中是原始數(shù)據(jù)類型,并且是唯一沒有空間大小限制的數(shù)據(jù)類型。和Java不同的是,var s = " javascript " 和var s = 'javascript'均是合法的表示方法。
數(shù)據(jù)轉換
在不同數(shù)據(jù)類型之間轉換是任何一門編程語言的一個重要特性,ECMAScript提供了一系列簡單的方法來實現(xiàn)數(shù)據(jù)的轉換,大多數(shù)數(shù)據(jù)類型都提供了簡單的轉換方法,對于復雜的轉換則有一些全局方法來完成,不管是哪一種方法,ECMAScript中數(shù)據(jù)轉換都非常簡單。
Boolean、number和string數(shù)據(jù)類型是原始數(shù)據(jù)類型,但它們同時是偽對象(在ECMAScript中偽對象到底該怎么解釋,運行機制如何還不清楚?有人知道請給予解答),擁有自己的屬性和方法,可以通過toString()方法來實現(xiàn)string類型的轉換。ECMAScript定義所有的對象,不管是偽對象還是真實的對象,都可以實現(xiàn)toString()方法,string被列為偽對象的行列,自然也擁有toString()方法。將數(shù)字類型數(shù)據(jù)轉換為string的時候,可以在 toString() 方法中加入2、8、16參數(shù),來實現(xiàn)不同進制的數(shù)據(jù)輸出,例如var n = 10; alert(n.toString(2))輸出為1010,alert(n.toString(8))輸出為12,n.toString()和n.toString(10)相同。
ECMAScript提供了兩種方法來實現(xiàn)string類型轉化為數(shù)字類型的方法:parseInt()和parseFloat()。其他類型轉換將會返回 NaN(Not a Number)。
Type Casting
ECMAScript數(shù)據(jù)類型的轉換通??梢酝ㄟ^三個方法來實現(xiàn):Boolean(value)、Number(value)和String(value),這樣通常會產(chǎn)生一些非預期的結果。
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()能實現(xiàn)所有類型數(shù)據(jù)的直接轉換,和使用toString()不同的是,String()能夠將null或undefined數(shù)據(jù)轉換為string。
引用類型
ECMAScript 實際上并沒有傳統(tǒng)意義上的類,只是通過定義對象來等同于其他語言中的類,這一點我還比較含糊,以后可能會明白,在文中還是以“類”來說明。
var ob = new Object();
以上定義了一個Object對象的實例,這種語法和Java比較類似。當有參數(shù)的時候需要括號來引用,當不存在參數(shù)時,括號可以去掉。由于ECMAScript語言比較松散,不管是前面所屬的基礎語法,還是后面將提到的語法知識,我們都應該盡量按照一定的書寫規(guī)范來約定自己的代碼格式,而不應充分發(fā)揮語言松散的特點。
Object類
Object類和Java里的java.lang.Object類比較相似,它是ECMAScript中其他所有類的基類,它具有如下屬性:
constructor—建立對象的函數(shù)的一個引用,對于Object類而言,該引用指向本地Object()方法。
prototype—對象里prototype對象的一個引用值。
Object 類擁有的方法:
hasOwnProperty(property)—判斷property屬性是否存在于對象中,property數(shù)據(jù)類型為string
isPrototypeOf(object)— 判斷一個對象是否是另一對象的 prototype
propertyIsEnumerable(property)— 判斷所給出的屬性能否使用 for 語句列舉出來
toString()—返回對象的原始類型string
valueOf()—返回對象合適的原始值,對于多數(shù)類而言,返回的值和toString()相同
Object類的每一個屬性和方法都被其他的類所重寫
Boolean類
定義方法var ob = new Boolean(true); ob是Boolean原始數(shù)據(jù)類型的一個引用。在使用Boolean對象過程中,需要注意,所有的對象會自動轉變?yōu)閠rue,因此var ob1 = new Boolean(false); var ob2 = ob1 && true; 最后ob2的值是true,非false。一般情況下,使用Boolean原始數(shù)據(jù)類型可以避免這種情況。
Number類
定義方法var o = new Number(15);
獲得原始數(shù)據(jù)的值var n = o.valueOf();
Number類有一些為數(shù)字類型的值特別設計的方法:
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原始數(shù)據(jù)類型,因為它是偽對象。
instanceof
instanceof操作符和typeof作用類似,不同的是,instanceof需要明確指定對象是否屬于某種特定類型。例如
var s = new String( " Good morning ! " );
alert(s instanceof String);
操作符和語句
ECMAScript 中大多數(shù)操作符、語句和 Java 都比較類似,但也有一些其特有的,如 label 語句, with 語句, for-in 語句等等。
Functions
Functions是ECMAScript的核心,在任何時候任何地方都可以運行的一組代碼語句。
function functionName(arg0, arg1, …… , argN) {
statements
}
當function沒有返回值或return語句后沒有值的時候,該function實際上會被系統(tǒng)定義為undefined,當function返回值的時候,function可以不必明確指定為某種數(shù)據(jù)類型。
關于重載
重載是面向對象語言的基本特性之一,但 ECMAScript 的 functions 并不能重載,在同一范圍里可以定義兩個完全相同的函數(shù),在調用函數(shù)的時候,最后的一個函數(shù)發(fā)揮作用。這種特性比較麻煩,但可以通過 arguments 對象來實現(xiàn)和重載類似的功能。
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發(fā)揮作用。
function func(i) {
alert(i + 10 );
}
function func(i) {
alert(i + 20 );
}
func( 5 ); // 輸出25
可以看出,是調用了最后的一個function使得數(shù)據(jù)結果為25,如果使用Function類來定義以上兩個函數(shù),那為什么會使用最后的一個function可能會更明確一些。
var func = new Function(“i”, “alert(i + 10 )”);
var func = new Function(“i”, “alert(i + 20 )”);
func( 5 );
func指向了另外一個引用,從而值發(fā)生了改變,func是作為function對象的引用而存在的,并且允許兩個變量指向同一個 function。
和Function類相關的屬性、方法有許多,例如length、toString()、valueOf()等等。其中toString()在調試程序中使用較多。
原文:http://www.blogjava.net/flyingis/archive/2006/06/13/52484.html
--和Java一樣,ECMAScript區(qū)分大小寫,注釋的格式相同,通過{}確定代碼塊,原始數(shù)據(jù)類型存儲在堆棧,對象的引用存儲在堆中
--ECMAScript是一種松散的語言,ECMAScript通過var操作符聲明變量,并且不限類型,例如var n = 25,那么n就是數(shù)字類型,var n = "string" ,那么n就是String類型
--在每一行代碼后,可以不寫分號,ECMAScript自動認為該行的末尾為該行代碼的最后;ECMAScript中的變量可以不用初始化,在幕后系統(tǒng)將自動完成初始化操作
--同一變量可以賦予不同類型的數(shù)據(jù);變量的第一個字符只能是字母、下劃線或$ ,其他的字符可以是下劃線、$、或任意的字母、數(shù)字、字符
--和其他語言一樣,變量最好遵循駝峰書寫法,或Pascal表示法、或匈牙利表示法
--和大多數(shù)語言不同的是, ECMAScript 變量在使用之前可以不必聲明,系統(tǒng)會自動將該變量聲明為全局變量,例如var m = " Good " ; n = m + " Morning " ; alert(n)輸出結構是 " Good Morning "
--在大多數(shù)語言里,String是對象,在ECMAScript中卻是原始數(shù)據(jù)類型
原始數(shù)據(jù)類型
ECMAScript原始數(shù)據(jù)類型有五種:Undefined、Null、Boolean、Number、String。
typeof—判斷變量和值的數(shù)據(jù)類型,通常有undefined、boolean、number、string、object五種類型。
Undefined—當變量被聲明但沒有初始化,或函數(shù)沒有明確返回一個值的時候,該變量或函數(shù)即為 Undefined 類型。
Null—undefined是null的一種派生,當代表一個對象的值不存在時,該對象返回null。
Boolean—包含兩個值,true and false , false不等于0,但0可以轉換為false 。
Number—可以定義32位整型數(shù)據(jù)或64位浮點型數(shù)據(jù)。定義數(shù)字類型變量時,在數(shù)字前加0即為八進制,加0x為十六進制,它們計算后返回的結果統(tǒng)一為十進制。通過var f = 1.0可以定義一個浮點類型變量,有意思的是,當f被用于計算之前,它實際是以 String類型存儲的。當浮點類型數(shù)據(jù)很大或很小時(可以前后移動六位),將使用E表示法來表示浮點數(shù)據(jù),最大可以存儲17位數(shù)據(jù)。另外,isFinite()方法可以判斷一個數(shù)值是否有限,isNaN()方法可以判斷一個數(shù)據(jù)是非數(shù)字類型。
String—String在ECMAScript中是原始數(shù)據(jù)類型,并且是唯一沒有空間大小限制的數(shù)據(jù)類型。和Java不同的是,var s = " javascript " 和var s = 'javascript'均是合法的表示方法。
數(shù)據(jù)轉換
在不同數(shù)據(jù)類型之間轉換是任何一門編程語言的一個重要特性,ECMAScript提供了一系列簡單的方法來實現(xiàn)數(shù)據(jù)的轉換,大多數(shù)數(shù)據(jù)類型都提供了簡單的轉換方法,對于復雜的轉換則有一些全局方法來完成,不管是哪一種方法,ECMAScript中數(shù)據(jù)轉換都非常簡單。
Boolean、number和string數(shù)據(jù)類型是原始數(shù)據(jù)類型,但它們同時是偽對象(在ECMAScript中偽對象到底該怎么解釋,運行機制如何還不清楚?有人知道請給予解答),擁有自己的屬性和方法,可以通過toString()方法來實現(xiàn)string類型的轉換。ECMAScript定義所有的對象,不管是偽對象還是真實的對象,都可以實現(xiàn)toString()方法,string被列為偽對象的行列,自然也擁有toString()方法。將數(shù)字類型數(shù)據(jù)轉換為string的時候,可以在 toString() 方法中加入2、8、16參數(shù),來實現(xiàn)不同進制的數(shù)據(jù)輸出,例如var n = 10; alert(n.toString(2))輸出為1010,alert(n.toString(8))輸出為12,n.toString()和n.toString(10)相同。
ECMAScript提供了兩種方法來實現(xiàn)string類型轉化為數(shù)字類型的方法:parseInt()和parseFloat()。其他類型轉換將會返回 NaN(Not a Number)。
Type Casting
ECMAScript數(shù)據(jù)類型的轉換通??梢酝ㄟ^三個方法來實現(xiàn):Boolean(value)、Number(value)和String(value),這樣通常會產(chǎn)生一些非預期的結果。
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()能實現(xiàn)所有類型數(shù)據(jù)的直接轉換,和使用toString()不同的是,String()能夠將null或undefined數(shù)據(jù)轉換為string。
引用類型
ECMAScript 實際上并沒有傳統(tǒng)意義上的類,只是通過定義對象來等同于其他語言中的類,這一點我還比較含糊,以后可能會明白,在文中還是以“類”來說明。
var ob = new Object();
以上定義了一個Object對象的實例,這種語法和Java比較類似。當有參數(shù)的時候需要括號來引用,當不存在參數(shù)時,括號可以去掉。由于ECMAScript語言比較松散,不管是前面所屬的基礎語法,還是后面將提到的語法知識,我們都應該盡量按照一定的書寫規(guī)范來約定自己的代碼格式,而不應充分發(fā)揮語言松散的特點。
Object類
Object類和Java里的java.lang.Object類比較相似,它是ECMAScript中其他所有類的基類,它具有如下屬性:
constructor—建立對象的函數(shù)的一個引用,對于Object類而言,該引用指向本地Object()方法。
prototype—對象里prototype對象的一個引用值。
Object 類擁有的方法:
hasOwnProperty(property)—判斷property屬性是否存在于對象中,property數(shù)據(jù)類型為string
isPrototypeOf(object)— 判斷一個對象是否是另一對象的 prototype
propertyIsEnumerable(property)— 判斷所給出的屬性能否使用 for 語句列舉出來
toString()—返回對象的原始類型string
valueOf()—返回對象合適的原始值,對于多數(shù)類而言,返回的值和toString()相同
Object類的每一個屬性和方法都被其他的類所重寫
Boolean類
定義方法var ob = new Boolean(true); ob是Boolean原始數(shù)據(jù)類型的一個引用。在使用Boolean對象過程中,需要注意,所有的對象會自動轉變?yōu)閠rue,因此var ob1 = new Boolean(false); var ob2 = ob1 && true; 最后ob2的值是true,非false。一般情況下,使用Boolean原始數(shù)據(jù)類型可以避免這種情況。
Number類
定義方法var o = new Number(15);
獲得原始數(shù)據(jù)的值var n = o.valueOf();
Number類有一些為數(shù)字類型的值特別設計的方法:
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原始數(shù)據(jù)類型,因為它是偽對象。
instanceof
instanceof操作符和typeof作用類似,不同的是,instanceof需要明確指定對象是否屬于某種特定類型。例如
var s = new String( " Good morning ! " );
alert(s instanceof String);
操作符和語句
ECMAScript 中大多數(shù)操作符、語句和 Java 都比較類似,但也有一些其特有的,如 label 語句, with 語句, for-in 語句等等。
Functions
Functions是ECMAScript的核心,在任何時候任何地方都可以運行的一組代碼語句。
function functionName(arg0, arg1, …… , argN) {
statements
}
當function沒有返回值或return語句后沒有值的時候,該function實際上會被系統(tǒng)定義為undefined,當function返回值的時候,function可以不必明確指定為某種數(shù)據(jù)類型。
關于重載
重載是面向對象語言的基本特性之一,但 ECMAScript 的 functions 并不能重載,在同一范圍里可以定義兩個完全相同的函數(shù),在調用函數(shù)的時候,最后的一個函數(shù)發(fā)揮作用。這種特性比較麻煩,但可以通過 arguments 對象來實現(xiàn)和重載類似的功能。
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發(fā)揮作用。
function func(i) {
alert(i + 10 );
}
function func(i) {
alert(i + 20 );
}
func( 5 ); // 輸出25
可以看出,是調用了最后的一個function使得數(shù)據(jù)結果為25,如果使用Function類來定義以上兩個函數(shù),那為什么會使用最后的一個function可能會更明確一些。
var func = new Function(“i”, “alert(i + 10 )”);
var func = new Function(“i”, “alert(i + 20 )”);
func( 5 );
func指向了另外一個引用,從而值發(fā)生了改變,func是作為function對象的引用而存在的,并且允許兩個變量指向同一個 function。
和Function類相關的屬性、方法有許多,例如length、toString()、valueOf()等等。其中toString()在調試程序中使用較多。
原文:http://www.blogjava.net/flyingis/archive/2006/06/13/52484.html
相關文章
JavaScript實現(xiàn)按照指定長度為數(shù)字前面補零輸出的方法
這篇文章主要介紹了JavaScript實現(xiàn)按照指定長度為數(shù)字前面補零輸出的方法,實例分析了javascript操作數(shù)字補零的技巧,需要的朋友可以參考下2015-03-03