標籤:locale script ons center 另一個 字串包含 color 浮點 比較
ECMAScript中一共有6種資料類型,其中包括5種基礎資料型別 (Elementary Data Type)(Undefined,Null,Boolean,Number,String)以及一種複雜資料類型(Object)。【ES6增加多了一種Symbol資料類型,但這裡先不做討論】
Undefined類型
Undefined類型只有一個undefined值。在使用var聲明變數但未對其加以初始化的時候,這個變數的值就會被自動的賦上undefined值。
1 {2 var name;3 console.log(name); //undefined4 }Null類型
Null類型也同樣只用一個null值。null值在邏輯角度上代表一個Null 物件指標,所以使用typeof操作符檢測null值時會返回“object”。
1 {2 var dd = null;3 console.log(typeof dd); 4 }
如果定義的變數準備在將來用於儲存對象,那麼最好將該變數初始化為null。這樣一來,只要直接檢查null值就可以知道相應的變數是否已經儲存了一個對象的引用。
Boolean類型
Boolean類型有兩個字面值:true和false。這裡需要注意一下,Boolean類型的字面值true和false是區分大小寫。True和False都不算是Boolean的值,只能算是標識符。
ECMAScript中所有資料類型值都能通過調用轉型函數Boolean()轉換為其相對應的Boolean值。
1 {2 var bool = 13;3 var _bool = Boolean(bool);4 console.log(_bool); //true5 }
調用轉換函式返回的值是true還是false,取決於要轉換的資料類型及其實際值。下表給出了各種資料類型及其相對應的轉換規則:
| 資料類型 |
轉換為true的值 |
轉換為false的值 |
| Boolean |
true |
false |
| String |
任何非Null 字元串 |
""(Null 字元串) |
| Number |
任何非零數字值(包括無窮大) |
0和NaN |
| Object |
任何對象 |
null |
| Undefined |
無 |
undefined |
Number類型
ECMAScript中的Number類型使用了IEEE754格式來表示整數和浮點數值,支援各種數實值型別。關於Number類型有幾點可以討論下。
浮點數值
所謂浮點數值,就是該數值中必須包含一個小數點,並且小數點後面必須至少有以為數字。為了減小儲存數值的時的記憶體佔用(儲存浮點數值需要的記憶體空間是儲存整數值的兩倍),ECMAScript會儘可能的將浮點數值轉換為整數值。
1 {2 var float1 = 1.; //小數點後沒有數字,解析為13 var float2 = 10.0 //整數,解析為104 }數值範圍
由於記憶體的限制,ECMAScript所能儲存的數值是有限的,其所能儲存的最小數值和最大數值分別儲存在Number.MIN_VALUE和Number.MAN_VALUE之中。在大多數的瀏覽器中,這兩個值分別是5e-324(科學技術法)和1.7976931348623157e+308。如果某次計算的結果超出了這個數值範圍,那麼這個數值就會被自動轉換成特殊的Infinity(正無窮)或者-Infinity(負無窮)。對Infinity和-Infinity的判斷可以通過使用isFinite()函數。這個函數在參數位於最小和最大數值之間時會返回true。
1 {2 var result1 = 121;3 var result2 = Number.MAX_VALUE + Number.MAX_VALUE;4 console.log(isFinite(result1)); //true5 console.log(isFinite(result2)); //false 6 }NaN
NaN,即非數值(Not a Number)是一個特殊的數值,這個數值用於表示一個本來要返回數值的操作但未返回數值的情況(這樣就不會拋出錯誤)。NaN本身具有兩個非同異常的特點。
-
- 任何涉及NaN的操作都會返回NaN,這個特點在多步計算中有可能導致問題。
- NaN與任何值都不相等,包括NaN自身。也就是說,NaN == NaN這條語句總是會返回false。
針對NaN的這兩個特點,ECMAScript定義了isNaN()函數。這個函數接受一個參數,該參數可以是任何類型,而函數會幫我們確定這個參數是否“不是數值”。isNaN()在接收到一個值之後,會嘗試將這個值轉換為數值,任何不能被轉換為數值的值都會導致這個函數返回true。
1 {2 console.log(isNaN(NaN)); //true3 console.log(isNaN(100)); //false(100是一個數值)4 console.log(isNaN(‘100‘)); //false(可以轉換成數值100)5 console.log(isNaN(‘blue‘)); //true(不能轉換成數值)6 console.log(isNaN(false)); //false(可以轉換成數值1)7 }
isNaN()也是適用於對象的,但是這裡不討論,下面+。
數值轉換
Number()、parseInt()和parseFloat()這三個函數可以把非數值轉換為數值。第一個轉型函數Number()可以用於任何資料類型,而另外兩個函數則專門用於把字串轉換成數值。
Number()函數的轉換規則如下。
-
- 如果是Boolean值,true和false將分別被轉換為1和0。
- 如果是數字值,只是簡單的傳入和返回。
- 如果是null值,返回0。
- 如果是undefined,返回NaN。
- 如果是字串,遵循如下規則。
- 如果字串中只包含數字,則將其轉換為十進位數值(前置的零會被忽略)。
- 如果字串中包含有效浮點格式,則將其轉換為對應的浮點數值(前置的零會被忽略)。
- 如果字串中包含有效十六進位格式,則將其轉換為相同大小的十進位整數值。
- 如果字串是空的,則將其轉換為0。
- 如果字串中包含出上述格式之外的字元,則將其轉換為NaN。
- 如果是對象,則調用對象的valueOf()方法,然後依照前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,然後再次依照前面的規則轉換返回的字串值。
1 {2 var num1 = Number(‘hello‘); //轉換為NaN,不包含任何有意義的數字值3 var num2 = Number(‘‘); //轉換為0,Null 字元串4 var num3 = Number(‘00101‘); //轉換為101,忽略前置字元為零5 var num4 = Number(‘true‘); //轉換為1,布爾值的轉換規則6 var num5 = Number(‘0012.3‘); //轉換為12.3,忽略前置字元為零7 }
相比較Number函數對字串複雜和不合理的轉換規則,parseInt()函數對字串的轉換則相對比較簡單和合理,所以更常用。parseInt()函數在轉換字串時,更多的是看其是否符合數值模式。它會忽略字串前面的空格,直至找到第一個非空白字元。如果第一個字元不是數字字元或者負號,parseInt()就會返回NaN。也就是說,用parseInt()轉換Null 字元串會返回NaN。如果第一個字元是數字字元,parseInt()會繼續解析第二個字元,直到解析完所有後續字元或者遇到了一個非數字字元。
1 {2 var num1 = parseInt(‘5656hello‘); //56563 var num2 = parseInt(‘‘); //NaN4 var num3 = parseInt(‘33.4‘); //335 var num4 = parseInt(‘33‘); //336 }
可以為parseInt()提供第二個參數:轉換時使用的基數(即多少進位)。如果知道要解析的值是十六進位格式的字串,那麼可以指定基數16作為第二個參數。
1 {2 var num1 = parseInt(‘0xAf‘, 16); //175,十六進位轉換3 var num2 = parseInt(‘AF‘, 16); //175,傳入第二個參數時,十六進位的‘0x‘可以省略4 var num3 = parseInt(‘AF‘); //NaN5 }
與parseInt()函數類似,parseFloat()也是從第一個字元開始解析每個字元。而且也是一直解析到字串末尾,或者解析到遇見一個無效的浮點數字字元為止。也就是說,字串中的第一個小數點是有效,而第二個小數點就是無效的了,因此它後面的字串將被忽略。其次,如果字串包含的是一個可解析的為整數的數,parseFloat()會返回整數。
1 {2 var num1 = parseFloat(‘456red‘); //456,解析為整數3 var num2 = parseFloat(‘22.5‘); //22.54 var num2 = parseFloat(‘123.123.12‘); //123.123,第一個小數點有效,第二個小數點無效5 var num3 = parseFloat(‘052.2‘); //52.5,忽略前置字元為零6 var num3 = parseFloat(‘0.125e7‘); //31250000,科學計數法7 }
String類型
String類型用於表示由零或多個16位Unicode字元組成的字元序列,即字串。字串可以由雙引號(")或者單引號(‘)表示。
字元字面量
String資料類型包含一些特殊的字元字面量,也叫逸出序列,用於表示非列印字元,或者具有其他用途的字元。逸出序列可以在出現在字串中的任意位置,而且也將被作為一個字元來解析。逸出序列有這些。
| 字面量 |
含義 |
| \n |
換行 |
| \t |
製表 |
| \b |
退格 |
| \r |
斷行符號 |
| \f |
進紙 |
| \\ |
斜杠 |
| \‘ |
單引號(‘),在用單引號表示的字串中使用。例如:‘He said,\‘hey.\‘‘ |
| \" |
單引號(‘),在用單引號表示的字串中使用。例如:‘He said,\"hey.\"‘ |
| \xnn |
以十六進位代碼nn表示的一個字元(其中n為0~F)。例如,\x41表示"A" |
| \unnnn |
以十六進位代碼nnnn表示的一個Unicode字元(其中n為0~F)。例如,\u03a3表示希臘字元Σ |
任何字串的長度都可以通過訪問其length屬性取得。
1 {2 var text = ‘Some words.‘3 console.log(text.length); //104 }
字串的特點
ECMAScript中的字串是不可變的,字串一旦建立,他們的值就不能改變。要改變某個變數儲存的字串,首先要銷毀原來的字串,然後再用另一個包含新值的字串填充該變數。
1 {2 var text = ‘Some words‘;3 text = text + ‘for you.‘; //將原text字串變數‘Some words‘和新建立字串值‘for you.‘串連,得到新的字串值‘Some words for you.‘,並將新的字串值填充text變數。4 }
轉換為字串
有兩種方式能夠把一個值轉換為一個字串。
第一種方式是使用幾乎每一個值都有的toString()方法(null和undefined只有這個方法)。這個方法會返回相應值的字串表現。
1 {2 var num = 11;3 var numToString = num.toString(); //‘11‘4 var bool = true;5 var boolToString = bool.toString(); //‘true‘6 }
調用數值的toString()方法時,可以傳遞一個參數:輸出數值的技術。預設情況下,toString()方法以十進位格式返回數值的字串表示。而通過傳遞參數,toString()可以輸出二進位、八進位、十六進位、乃至其他任意有效進位格式表示的字串值。
1 {2 var num = 10;3 console.log(num.toString()); //‘10‘4 console.log(num.toString(2)); //‘1010‘5 console.log(num.toString(8)); //‘12‘6 console.log(num.toString(10)); //‘10‘7 console.log(num.toString(16)); //‘a‘8 }
第二種方式能在任何類型值的情況下使用(包括null和undefined),就是調用轉型函數String()。
-
- 如果值有toString()方法,則調用該方法(沒有參數)並返回相應的結果。
- 如果值是null,則返回"null"。
- 如果值是undefined,則返回"undefined"。
1 { 2 var value1 = 10; 3 var value2 = true; 4 var value3 = null; 5 var value4; 6 console.log(String(value1)); //‘10‘ 7 console.log(String(value2)); //‘true‘ 8 console.log(String(value3)); //‘null‘ 9 console.log(String(value4)); //‘undefined‘,value4未賦值所以是undefined10 }Object類型
ECMAScript中的對象其實就是一組資料和功能的集合。對象可以通過執行new操作符後跟要建立的物件類型的名稱來建立。而建立Object類型的執行個體並為其添加屬性和方法,就可以建立自訂對象。
1 {2 var o = new Object();3 o.name = ‘myname‘;4 }
在ECMAScript中,Object類型是所有它的實力的基礎。換句話說,Object類型所具有的任何屬性和方法也同樣存在於更具體的對象中。因此,每個執行個體都具有下面的屬性和方法。
-
- constructor:儲存著用於建立當前對象的函數,又稱建構函式。對於前面的物件變數o而言,建構函式就是Object()。
- hasOwnProperty(propertyName):用於檢查給定的屬性在當前對象執行個體中(而不是在執行個體的原型中)是否存在。其中,作為參數的屬性名稱(propertyName)必須以字串形式指定。
- isPropertyOf(object):用於檢查傳入的對象是否是當前對象的原型。
- propertyIsEnumerable(propertyName):用於檢查給定的屬性是否能夠使用for-in語句來枚舉。
- toLocaleString():返回對象的字串表示,該字串與執行環境的地區對應。
- toString():返回對象的字串表示。
- valueOf():返回對象的字串、數值或布爾值表示。通常和toString()方法的傳回值相同。
javascript篇-----資料類型