數據類型
ECMAScript中有5中簡單的數據類型(也成為基本數據類型):Undefined、Null、Boolean、Number、String
。還有一種複雜的數據類型——Object注:Object本質上是有一組無序的鍵值對組成的
1 typeof操作符
鑑於ECMAScript是鬆散類型的,因此需要一個手段來檢測給定的變量時什麼類型,typeof就是負責這個功能的操作符。對一個值使用typeof操作符可能返回下列某個字符串:
- "undefined"——如果這個值未定義
- "boolean"——如果這個值是布爾值
- "string"——如果這個值是字符串
- "number"——如果這個值是數值
- "object"——如果這個值是對象或null
- "function"——如果這個值是函數
下面舉一些使用typeof操作符的例子:
<code>var message = "some string";
alert(typeof message);\t\t// "string"
alert(typeof (message));\t// "string"
alert(typeof 95);\t\t\t// "number"/<code>
2 Undefined類型
Undefined類型只有一個值,級特殊的undefined。在使用var聲明變量,但未對其加以初始化時,這個變量就是undefined,例如:
<code>var message;
alert(message == undefined);\t// true/<code>
也可以將變量直接初始化為undefined:
<code>var message = undefined;
alert(message == undefined);\t// true/<code>
3 Null類型
Null類型是第二個只有一個值得數據類型,這個特殊的值是null。從邏輯角度來看,null值表示一個空**對象**指針,這也正是為什麼用typeof檢測null值會返回object的原因:
<code>var car = null;
alert(typeof car);\t//object/<code>
實際上undefined值是派生自null值得,如下例:
<code>alert(null == undefined);\t//true/<code>
但是兩者還是有區別的,如果一個變量暫時不賦值,將來要使用。我們不會把一個變量顯示的定義為undefined,而是會定義為null。
4 Boolean類型
Boolean類型是ECMAScript中使用得最多的一種類型,該類型有兩個字面值:true和false。
<code>var found = true;
var lost = false;/<code>
雖然Boolean類型的字面值只有兩個,但ECMAScript中所有類型的值都有與這兩個Boolean值等價的值。也就是說能夠定義的所有值要麼能轉成true,要麼能轉成false,可以用轉型函數Boolean()轉化。
<code>var message = "Hello world";
var messageAsBoolean = Boolean(message);
alert(messageAsBoolean);\t//true/<code>
下表給出了各種數據類型及其對應的轉換規則:
注:n/a(或N/A),是not applicable的縮寫,意思是“不適用”。
在流程控制語句中,會自動執行Boolean轉換,如下所示:
<code>var message = "Hello world!";
if (message) { \t\t\t//這裡執行了Boolean轉換,將message轉為true
\talert("Value is true");
}/<code>
5 Number類型
Number類型應該是ECMAScript中最令人關注的數據類型了,直接上例子:
<code>var intNum = 55;\t\t// 十進制的55
var octalNum = 070;\t\t// 八進制的56
var hexNum = 0xA;\t\t// 十六進制的10/<code>
1.浮點數值
所謂浮點數值,就是該數值中必須包含一個小數點,並且小數點後面必須至少有以為數字,浮點數值的例子:
<code>var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; \t//有效,但不推薦/<code>
由於浮點數值佔用的內存是整數值的兩倍,所以ECMAScript會不失時機地將浮點數值轉換為整數值,如下所示:
<code>var floatNum1 = 1.;\t\t//小數後面沒有數字——解析為1
var floatNum2 = 10.0;\t//整數——解析為10/<code>
還有一種可以表示極大或極小的浮點數值的方法——e表示法,如下所示:
<code>var floatNum = 3.125e7;\t/<code>
其含義是3.125*10^7
<code>var floatNum = 3e-7;/<code>
其含義是3*10^(-7)
2.數值範圍
由於內存的限制,ECMAScript並不能保存世界上所有的數值。ECMAScript能夠表示的最小數值保存在Number.MIN_VALUE中,這個數值是5e-324;能夠表示的最大數值保存在Number.MAX_VALUE中,這個數值是1.7976931348623157e+308。如果某次計算的結果超過這個範圍,則會被轉換成特殊的Infinity值。
<code>var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); //false/<code>
3.NaN
NaN,即非數值(Not a Number),這個數值用於表示一個本來要返回數值的操作數未返回數值的情況,當計算錯誤的時候,不會拋出錯誤,而是返回一個NaN,這樣就不會影響後面代碼的執行。
- 任何涉及NaN的操作(例如NaN/10)都會返回NaN
- NaN與任何值都不相等,包括NaN本身
<code>alert(NaN == NaN);\t//false
alert(isNaN(NaN));\t//true/<code>
4.數值轉換
有3個函數可以把非數值轉換為數值:Number()、parseInt()、parseFloat()。
- Number()——可以用於任何數值類型
- parseInt()——用於字符串轉數值
- parseFloat()——用於字符串轉數值
Number()函數的轉換規則如下:
- 如果是Boolean值,true和false將分別被轉換為1和0
- 如果是數字值,只是簡單的傳入和返回
- 如果是null值,返回0
- 如果是undefined,返回NaN
- 如果是對象,則調用對象的valueOf()方法,然後依照前面的規則轉換返回值
- 如果是字符串,遵循以下規則:
- 如果字符串中包含數字,則將其轉換為十進制數值
- 如果字符串中包含有效的浮點格式,如"1.1",則將其轉換為對應的浮點數值
- 如果字符串中包含有效的十六進制格式,如"0xf",則將其轉換為相同大小的十進制整數值
- 如果字符串是空的,則將其轉換為0
- 如果字符串中包含除上述格式之外的字符,則將其轉換為NaN
例如:
<code>var num1 = Number("Hello world!");\t//NaN
var num2 = Number("");\t\t\t\t//0
var num3 = Number("000011");\t\t//11
var num4 = Number(true);\t\t\t//1/<code>
由於Number()在轉換字符串時比較複雜而且不夠合理,因此更常用的是parseInt()函數。parseInt()會從字符串第一個非空格字符開始掃描,如果第一個字符不是數字符號或者負號,parseInt()就會返回NaN。如果第一個字符是數字字符,parseInt()會繼續解析第二個字符,知道遇到一個非數字字符。例如,"1234blue"會被轉換為1234。"22.5"會被解析成22。
<code>var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六進制數)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八進制數)
var num6 = parseInt("70"); // 70(十進制數)
var num7 = parseInt("0xf"); // 15(十六進制數)
var num8 = parseInt("f",16); // 15(十六進制數,另一種寫法,推薦這麼寫)/<code>
parseFloat()與parseInt()類似,但有兩點區別:
- parseFloat()解析字符串中的第一個小數點是有效的,而第二個小數點無效
- parseFloat()始終會忽略前導的零
- 十六進制的字符串始終會被轉換成0
- 如果字符串可以解析為整數,那麼parseFloat()會返回整數
<code> var num1 = parseFloat("1234blue"); // 1234(整數)
var num2 = parseFloat("0xA"); // 0
var num3 = parseFloat("22.5"); // 22.5
var num4 = parseFloat("22.34.5"); // 22.34
var num5 = parseFloat("0908.5"); // 908.5
var num6 = parseFloat("3.125e7"); // 31250000/<code>
6 String類型
String類型用於表示有零或多個16位Unicode字符組成的字符序列,即字符串。字符串可以用雙引號(")或單引號(')表示,因此下面的寫法都是有效的:
<code>var firstName = "Kobe";
var lastName = 'Bryant';/<code>
1.字符字面量
String數據類型包含一些特殊的字符字面量,也叫轉義序列,用於表示非打印字符,或者具有其他用途的字符。這些字符字面量如下表所示:
2.字符串的特點
ECMAScript中的字符串是**不可變**的,也就是說,字符串一旦創建,它們的值就不能改變。要改變某個變量保存的字符,首先要銷燬原來的字符串,然後在用另一個包含新值得字符串填充該變量,例如:
<code>var lang = "Java";
lang = lang + "Script";/<code>
第二行的動作是,創建一個能容納10個字符的新字符串,然後在這個字符串中填充"Java"和"Script",然後將原來的字符串"Java"和字符串"Script"銷燬。
3.轉換為字符串
要把一個值轉換為一個字符串有兩種方式。
a. toString()方法,該方法返回字符串的一個副本
<code>var age = 11;
var ageAsString = age.toString();\t\t// 字符串"11"
var found = true;
var foundAsString = found.toString();\t// 字符串"true"/<code>
由於null和undefined值沒有toString()方法,可以用下面的String()方法轉換為字符串
b.String()方法,可以將任何類型的值轉換為字符串。
- 如果值有toString()方法,則電泳該方法並返回相應的結果
- 如果值是null,則返回"null"
- 如果值是undefined,則返回"undefined"
下面看幾個例子:
<code>var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"/<code>
7 Object類型
ECMAScript中的對象其實就是一組數據和功能的集合。Object對象創建的方法如下:
<code>var o = new Object();/<code>
Object的每個實例具有如下屬性和方法:
- constructor:保存著用於創建當前對象的函數。對於前面的例子而言,構造函數就是Object()
- hasOwnProperty(propertyName):用於檢查給定的屬性在當前對象中是否存在
- isPrototypeOf(object):用於檢查傳入的對象是否是當前對象的原型
- propertyIsEnumerablepropertyName():用於檢查給定的屬性能否能用for-in語句來枚舉
- toLocaleString():返回對象的字符串表示,該字符串與執行環境的地區對應
- toString():返回對象的字符串表示
- valueOf():返回對象的字符串、數值或布爾值表示。通常與toString()方法的返回值相同
如果這篇博客對你有用,點個贊再走唄~
閱讀更多 劉陽不吃飯 的文章
關鍵字: ECMAScript 就夠 JavaScript