1.ECMAScript數值的範圍 由於記憶體的限制,在大多數瀏覽器中,ECMAScript能夠拿保存的數據的範圍是 5e-324 ~ 1.7976931348623157e+308,其中最小的數值保存在Number.MIN_VALUE中,最大的數值保存在Number.MAX_VALUE中。 如果在計 ...
1.ECMAScript數值的範圍
由於記憶體的限制,在大多數瀏覽器中,ECMAScript能夠拿保存的數據的範圍是 5e-324 ~ 1.7976931348623157e+308,其中最小的數值保存在Number.MIN_VALUE中,最大的數值保存在Number.MAX_VALUE中。
如果在計算的結果超出這個數值的範圍,這個數值會自動被轉換成特殊的Infinity值,具體來說,如果是負數,會被轉換成 -Infinity(負無窮),如果是正的,會被轉換成 +Infinity(正無窮)。
需要註意的是,如果某次計算返回的是正或者負的Infinity,則該值將無法繼續參加下一次的計算,因為Infinity不是能過參與計算的數值。
使用 isFinite()函數,可以確定一個數是否是有窮,isFinite()函數在參數位於最小和最大數值之間時會返回true。
eg:
var age=18;
alert(isFinite(age));
結果:
2.NaN值:NaN即非數值(Not a Number)是一個特殊的數值,這個數值用來表示一個本來返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤)
eg:在其他編程語言中,任何數值除以0都有會導致錯誤從而停止代碼的執行。但是在ECMAScript中,任何數字除以0都會返回NaN,因此不會影響其他代碼的執行。
(對上文黃色部分進行說明,在高程書上是這麼寫的,但是在實際上,只有0除以0才會返回NaN值,正數除以0,返回的是Infinity,負數除以0,返回的 -Infinity)詳見以下實例:
var age=0;
alert(age/0);
var age=18;
alert(age/0);
var age=-18;
alert(age/0);
(1)NaN值的兩個特性:
任何涉及NaN的操作都會返回NaN。
NaN值和任何值都不相等,包括NaN本身。
(2)isNaN()函數,該函數接收一個參數,如果該參數不是數值,它會嘗試將該值轉換為數值,而任何不能轉換為數值的值會導致這個函數返回 true。
(3)isNaN()也適用於對象,詳見後面的章節。
3.數值轉換
有三個函數可以把非數值轉換為數值:
Number()
parseInt()
parseFloat()
Number()可用於任何數據類型,parseInt()和parseFloat()專門用於吧字元串轉換為數值。
(1)Number()函數的具體轉換規則見高程書P30~31.
(2)由於Number()函數在轉換字元串是比較複雜而且不夠合理,因此在處理整數的時候更常用的是parseInt()函數。高程P31。
(3)在使用parseInt()函數解析八進位字面量字元串時,ECMAScript 3 和ECMAScript 5 存在不同:
var num=parseInt(“070”);
ECMAScript 3 認為是56(八進位),ECMAScript 5 認為是70(十進位)。因為在ECMAScript 5 Javascript引擎中,parseInt()已經有解析不具有解析八進位的能力。在ECMAScript 5 中,即使是在非嚴格模式下也是如此。
(4)可以為parseInt()函數設置第二個參數,即轉化時使用的基數(多少進位)。指定基數會影響到轉換的輸出結果:
eg:
1 var num1=parseInt("10",2); 2 var num2=parseInt("10",8); 3 var num3=parseInt("10",10); 4 var num4=parseInt("10",16); 5 alert(num1); 6 alert(num2); 7 alert(num3); 8 alert(num4);
結果圖如下:
註意:
不指定基數意味著讓parseInt()決定如何解析輸入的字元串,因此為了避免錯誤的解析,我們在使用該函數時最好指定基數,多數情況下,我們要解析的都是十進位數值,因此始終將10作為第二個參數是十分有必要的。
(5)parseFloat()函數
parseFloat()與paserInt()類似,也是從第一個字元(位置0)開始解析每一個字元,也是解析到字元串的尾部或是解析到遇到一個無效的浮點數字元為止。
也就是說,字元串的第一個小數點是有效的,而第二個小數點是無效的,因此它後面的字元串將被忽略。
註意:
parseFloat()只解析十進位值,它始終會忽略前導0。
parseFloat()可以識別所有的浮點數格式。
eg: var num=parseFloat(“3.125e7”); //31250000
4.String類型
String類型用於表示有零個或多個16位Unicode字元組成的字元序列,即字元串。可以有單引號或是雙引號表示,但是不能混合使用。
(1)字元字面量
String數據類型包含一些特殊的字元字面量,叫做轉義序列。(詳見高程書P33)
(2)length屬性
任何字元串的長度都可以通過該訪問其length屬性取得。
eg:
1 var text="hello LIN!" 2 alert(text.length);
包括text中的空格符,該字元串的長度是10。
註意:這個屬性返回的字元數包括16位字元的數目,如果字元串包含雙位元組字元,那麼length屬性可能不會精確地返回字元串中的字元數目。
(3)字元串的特點
ECMAScript中字元串是不可變的,字元串一旦被創建,它們的值就不會改變,要改變某個變數保存的字元串,首先要銷毀原來的字元串,然後再另一個新值的字元串填充該變數。
eg:
var lang=“java”;
lang=lang+“Script”;
實現這個操作的過程是:
首先創建一個能容納10個字元的新字元串,然後在這個字元串中填充“java”和“Script”,最後一步銷毀原來的字元串“java”和“Script”,因為這兩個字元串已經沒有用了。(這個過程在後臺發生,這也是一些舊版本的瀏覽器在拼接字元串時速度很慢的原因。)
(4)轉換為字元串
toString()方法——返回相應值的字元串表現。
數值,布爾值,對象和字元串值都有toString()方法。(對的,字元串也都有一個toString()方法,該方法返回字元串的一個副本。)
一般情況下,調用toString()不用傳遞參數,但是在調用數值的toString()方法時,可以傳遞一個參數:輸出數值的基數。
eg:
1 var num=10; 2 alert(num.toString()); 3 alert(num.toString(2)); 4 alert(num.toString(8)); 5 alert(num.toString(10)); 6 alert(num.toString(16));
結果圖依次如下:
String()——該轉型函數能夠將任何類型的值轉換成字元串。String()函數遵循的規則如下:
如果值有toString()方法,則調用該方法並返回相應的結果。
如果值是null,這返回“null”。
如果值是undefined,則返回“undefined”。
5.Object類型
ECMAScript中的對象其實就是一組數據和功能的集合。對象可以通過執行new操作符後跟要創建的對象類型的名稱來創建。而創建Object類型的實例併為其添加屬性和(或是)方法,就可以創建自定義對象。
eg: var o=new object();
Object的實例具有的屬性和方法詳見高程P35。