JavaScript中的數據類型,看這一篇就夠了

數據類型

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>

下表給出了各種數據類型及其對應的轉換規則:

JavaScript中的數據類型,看這一篇就夠了

注: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數據類型包含一些特殊的字符字面量,也叫轉義序列,用於表示非打印字符,或者具有其他用途的字符。這些字符字面量如下表所示:

JavaScript中的數據類型,看這一篇就夠了

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()方法的返回值相同


如果這篇博客對你有用,點個贊再走唄~


分享到:


相關文章: