ECMAScript型別轉換

2021-05-01 19:27:25 字數 4972 閱讀 4864

ecmascript 的 boolean 值、數字和字串的原始值的有趣之處在於它們是偽物件,這意味著它們實際上具有屬性和方法。

例如,要獲得字串的長度,可以採用下面的**:

var scolor = "red";

alert(scolor.length); //輸出 "3"

儘管 "red" 是原始型別的字串,它仍然具有屬性 length,用於存放字串的大小。

總而言之,3 種主要的原始型別 boolean 值、數字和字串都有 tostring() 方法,可以把它們的值轉換成字串。

boolean 型別的 tostring() 方法只是輸出 "true" 或 "false",結果由變數的值決定:

var bfound = false;

alert(bfound.tostring()); //輸出 "false"

number 型別的 tostring() 方法比較特殊,它有兩種模式,即預設模式和基模式。採用預設模式,tostring() 方法只是用相應的字串輸出數字值(無論是整數、浮點數還是科學計數法),如下所示:

var inum1 = 10;

var inum2 = 10.0;

alert(inum1.tostring()); //輸出 "10"

alert(inum2.tostring()); //輸出 "10"

注釋:在預設模式中,無論最初採用什麼表示法宣告數字,number 型別的 tostring() 方法返回的都是數字的十進位制表示。因此,以八進位制或十六進製制字面量形式宣告的數字輸出的都是十進位制形式的。

採用 number 型別的 tostring() 方法的基模式,可以用不同的基輸出數字,例如二進位制的基是 2,八進位制的基是 8,十六進製制的基是 16。

基只是要轉換成的基數的另一種加法而已,它是 tostring() 方法的引數:

var inum = 10;

alert(inum1.tostring(2)); //輸出 "1010"

alert(inum1.tostring(8)); //輸出 "12"

alert(inum1.tostring(16)); //輸出 "a"

在前面的示例中,以 3 種不同的形式輸出了數字 10,即二進位制形式、八進位制形式和十六進製制形式。html 採用十六進製制表示每種顏色,在 html 中處理數字時這種功能非常有用。

注釋:對數字呼叫 tostring(10) 與呼叫 tostring() 相同,它們返回的都是該數字的十進位制形式。

ecmascript 提供了兩種把非數字的原始值轉換成數字的方法,即 parseint() 和 parsefloat()。

正如您可能想到的,前者把值轉換成整數,後者把值轉換成浮點數。只有對 string 型別呼叫這些方法,它們才能正確執行;對其他型別返回的都是 nan。

在判斷字串是否是數字值前,parseint() 和 parsefloat() 都會仔細分析該字串。

parseint() 方法首先檢視位置 0 處的字元,判斷它是否是個有效數字;如果不是,該方法將返回 nan,不再繼續執行其他操作。但如果該字元是有效數字,該方法將檢視位置 1 處的字元,進行同樣的測試。這一過程將持續到發現非有效數字的字元為止,此時 parseint() 將把該字元之前的字串轉換成數字。

例如,如果要把字串 "12345red" 轉換成整數,那麼 parseint() 將返回 12345,因為當它檢查到字元 r 時,就會停止檢測過程。

字串中包含的數字字面量會被正確轉換為數字,比如 "0xa" 會被正確轉換為數字 10。不過,字串 "22.5" 將被轉換成 22,因為對於整數來說,小數點是無效字元。

一些示例如下:

var inum1 = parseint("12345red");	//返回 12345

var inum1 = parseint("0xa"); //返回 10

var inum1 = parseint("56.9"); //返回 56

var inum1 = parseint("red"); //返回 nan

parseint() 方法還有基模式,可以把二進位制、八進位制、十六進製制或其他任何進製的字串轉換成整數。基是由 parseint() 方法的第二個引數指定的,所以要解析十六進製制的值,需如下呼叫 parseint() 方法:

var inum1 = parseint("af", 16);	//返回 175
當然,對二進位制、八進位制甚至十進位制(預設模式),都可以這樣呼叫 parseint() 方法:

var inum1 = parseint("10", 2);	//返回 2

var inum2 = parseint("10", 8); //返回 8

var inum3 = parseint("10", 10); //返回 10

如果十進位制數包含前導 0,那麼最好採用基數 10,這樣才不會意外地得到八進位制的值。例如:

var inum1 = parseint("010");	//返回 8

var inum2 = parseint("010", 8); //返回 8

var inum3 = parseint("010", 10); //返回 10

在這段**中,兩行**都把字元 "010" 解析成乙個數字。第一行**把這個字串看作八進位制的值,解析它的方式與第二行**(宣告基數為 8)相同。最後一行**宣告基數為 10,所以 inum3 最後等於 10。

parsefloat() 方法與 parseint() 方法的處理方式相似,從位置 0 開始檢視每個字元,直到找到第乙個非有效的字元為止,然後把該字元之前的字串轉換成整數。

不過,對於這個方法來說,第乙個出現的小數點是有效字元。如果有兩個小數點,第二個小數點將被看作無效的。parsefloat() 會把這個小數點之前的字元轉換成數字。這意味著字串 "11.22.33" 將被解析成 11.22。

使用 parsefloat() 方法的另一不同之處在於,字串必須以十進位制形式表示浮點數,而不是用八進位制或十六進製制。該方法會忽略前導 0,所以八進位制數 0102 將被解析為 102。對於十六進製制數 0xa,該方法將返回 nan,因為在浮點數中,x 不是有效字元。

此外,parsefloat() 方法也沒有基模式。

下面是使用 parsefloat() 方法的一些示例:

var fnum1 = parsefloat("12345red");	//返回 12345

var fnum2 = parsefloat("0xa"); //返回 nan

var fnum3 = parsefloat("11.2"); //返回 11.2

var fnum4 = parsefloat("11.22.33"); //返回 11.22

var fnum5 = parsefloat("0102"); //返回 102

var fnum1 = parsefloat("red"); //返回 nan

您還可以使用強制型別轉換(type casting)來處理轉換值的型別。使用強制型別轉換可以訪問特定的值,即使它是另一種型別的。

編者注:cast 有「鑄造」之意,很貼合「強制轉換」的意思。

ecmascript 中可用的 3 種強制型別轉換如下:

用這三個函式之一轉換值,將建立乙個新值,存放由原始值直接轉換成的值。這會造成意想不到的後果。

當要轉換的值是至少有乙個字元的字串、非 0 數字或物件時,boolean() 函式將返回 true。如果該值是空字串、數字 0、undefined 或 null,它將返回 false。

可以用下面的**測試 boolean 型的強制型別轉換:

var b1 = boolean("");		//false - 空字串

var b2 = boolean("hello"); //true - 非空字串

var b1 = boolean(50); //true - 非零數字

var b1 = boolean(null); //false - null

var b1 = boolean(0); //false - 零

var b1 = boolean(new object()); //true - 物件

number() 函式的強制型別轉換與 parseint() 和 parsefloat() 方法的處理方式相似,只是它轉換的是整個值,而不是部分值。

還記得嗎,parseint() 和 parsefloat() 方法只轉換第乙個無效字元之前的字串,因此 "1.2.3" 將分別被轉換為 "1" 和 "1.2"。

用 number() 進行強制型別轉換,"1.2.3" 將返回 nan,因為整個字串值不能轉換成數字。如果字串值能被完整地轉換,number() 將判斷是呼叫 parseint() 方法還是 parsefloat() 方法。

下表說明了對不同的值呼叫 number() 方法會發生的情況:

用法結果

number(false)

0number(true)

1number(undefined)

nannumber(null)

0number("1.2")

1.2number("12")

12number("1.2.3")

nannumber(new object())

nannumber(50)

50最後一種強制型別轉換方法 string() 是最簡單的,因為它可把任何值轉換成字串。

要執行這種強制型別轉換,只需要呼叫作為引數傳遞進來的值的 tostring() 方法,即把 12 轉換成 "12",把 true 轉換成 "true",把 false 轉換成 "false",以此類推。

強制轉換成字串和呼叫 tostring() 方法的唯一不同之處在於,對 null 和 undefined 值強制型別轉換可以生成字串而不引發錯誤:

var s1 = string(null);	//"null"

var onull = null;

var s2 = onull.tostring(); //會引發錯誤

在處理 ecmascript 這樣的弱型別語言時,強制型別轉換非常有用,不過應該確保使用值的正確。

ECMAScript 原始型別

typeof運算子對於null值會返回 object 當宣告的變數未初始化時,該變數的預設值是underfined 值underfined不同於未定義的值。typeof運算子並不真正區分這兩種值 var otemp alert typeof otemp alert typeof otemp2 輸出都...

ECMAScript 引用型別

背好像不那麼痛了 真的是這麼強壯的我!哈哈哈!想想6級ohgod!自從第二次考完之後,我越來越覺得是拼運氣了。其實根本就沒有要認真學認真賺分的樣子。現在才覺得起碼背幾篇作文咯。看得再多篇也不如重複地看一篇!哎哎哎先不說 還想早點 呢!說!昨天學的記了多少!引用型別通常叫做類class 其實,ecma...

ECMAScript 引用型別

新建物件 var obj new object var obj var obj view code hasownproperty property 方法 var obj obj.hasownproperty age 返回true obj.hasownproperty name 返回false vie...