JavaScript數(shù)據(jù)類型

數(shù)據(jù)類型

JavaScript有六種數(shù)據(jù)類型,包括五種基本數(shù)據(jù)類型(Number、String、Boolean、Undefined、Null)最新的ECMAScript標準定義了7種數(shù)據(jù)類型,六種原始類型(Number、String、Boolean、Undefined、Null、Symbol[1])包括,和一種復(fù)雜數(shù)據(jù)類型(Object)也稱引用類型。基本類型的數(shù)據(jù)是存放在棧內(nèi)存中的,而引用類型的數(shù)據(jù)是存放在堆內(nèi)存中的。

[1].在ES6中又添加了一種新的數(shù)據(jù)類型Symbol。


Number類型

JavaScript中只有一個數(shù)字類型。他在內(nèi)部被表示為64位的浮點數(shù),和Java的double數(shù)字類型一樣。和其他大多數(shù)編程語言不通的是,他沒有分離出整數(shù)類型,所以1和1.0的值相同。對于浮點字面量的有趣之處是用它進行計算之前,真正存儲的是字符串。

八進制和十六進制

整數(shù)也可以被表示為八進制或十六進制的字面量。八進制字面量的首數(shù)字必須是0,氣候數(shù)字是任何八進制數(shù)字(0-7),如下面的代碼所示:

var iNum = 070; //070等于十進制的 56

十六進制的字面量首位數(shù)字必須是0,后面接字母x,然后是任意的十六進制數(shù)字(0到9和A到F)。這些字母可以是大寫的也可以是小寫的。例如:

var iNum = 0x1f;   //0x1f 等于十進制的 31
var iNum = 0xAB; //0xAB 等于十進制的 171

注意: 盡管所有整數(shù)都可以表示為八進制或十六進制的字面量,但是所有運算返回的都是十進制結(jié)果。

科學計數(shù)法

對于非常大或非常小的數(shù),可以用科學計數(shù)法表示浮點數(shù),可以吧一個數(shù)表示為數(shù)字(包括十進制數(shù))加e(或E),后面加乘以10的倍數(shù),例如:

var fNum = 5.618e7

該變量表示的數(shù)是56180000。把科學計數(shù)法轉(zhuǎn)化成計算式(5.618 x 10^7)就可以得到該值。

特殊的number值

有幾種特殊的值也被定義成Number類型。前兩個是Number.MAX_VALUENumber.MIN_VALUE,它們定義了 Number 值集合的外邊界。事實上,有專門的值表示無窮大,(如你猜到的)即 Infinity。Number.POSITIVE_INFINITY的值為 Infinity。Number.NEGATIVE_INFINITY 的值為-Infinity
對任何數(shù)調(diào)用 isFinite()方法,以確保該數(shù)不是無窮大。
最后一個是NaN,表示非數(shù)(not a number)。一般來說這種情況發(fā)生在類型轉(zhuǎn)換失敗時。比如要把單詞blue轉(zhuǎn)換成數(shù)值就會失敗。重要的一點,NaN與自身不相等。

alert(NaN == NaN);  //輸出 "false"

可以使用isNaN()來進行判斷

alert(isNaN("blue"));  //輸出 "true"
alert(isNaN("666"));  //輸出 "false"

String類型

String類型字面量有雙引號或單引號聲明。而Java則是用雙引號聲明字符串,用單引號聲明字符。
字符串中每個字符都有特定的位置,首字符從位置0開始,第二個字符在位置1,依此類推。



Boolean類型

Boolean 類型是 ECMAScript 中最常用的類型之一。它有兩個值 true 和 false (即兩個 Boolean 字面量)。

即使 false 不等于 0,0 也可以在必要時被轉(zhuǎn)換成 false,這樣在 Boolean 語句中使用兩者都是安全的。


Undefined類型

Undefined 類型只有一個值,即 undefined。當聲明的變量未初始化時,該變量的默認值是 undefined。

var oTemp;

前面一行代碼聲明變量 oTemp,沒有初始值。該變量將被賦予值 undefined,即 undefined 類型的字面量??梢杂孟旅娴拇a段測試該變量的值是否等于 undefined:

var oTemp;
alert(oTemp == undefined);

這段代碼將顯示 "true",說明這兩個值確實相等。還可以用 typeof 運算符顯示該變量的值是 undefined:

var oTemp;
alert(typeof oTemp); //輸出 "undefined"

提示:值 undefined 并不同于未定義的值。但是,typeof 運算符并不真正區(qū)分這兩種值??紤]下面的代碼:

var oTemp;
alert(typeof oTemp);  //輸出 "undefined"
alert(typeof oTemp2);  //輸出 "undefined"

前面的代碼對兩個變量輸出的都是 "undefined",即使只有變量 oTemp2 從未被聲明過。如果對 oTemp2 使用除 typeof 之外的其他運算符的話,會引起錯誤,因為其他運算符只能用于已聲明的變量上。

例如,下面的代碼將引發(fā)錯誤:

var oTemp;
alert(oTemp2 == undefined);

當函數(shù)無明確返回值時,返回的也是值 "undefined",如下所示:

function testFunc() {
}
alert(testFunc() == undefined);  //輸出 "true"

Null類型

null類型被看做空對象指針。它只有一個專用值 null,即它的字面量。值 undefined 實際上是從值 null 派生來的,因此 ECMAScript 把它們定義為相等的。

alert(null == undefined);  //輸出 "true"

盡管這兩個值相等,但它們的含義不同。undefined是聲明了變量但未對其初始化賦予改變量的值,null則用于表示尚未存在的對象。如果函數(shù)或方法要返回的是對象,那么找不到該對象時,返回的通常是null。

typeof 運算符

typeof 運算符有一個參數(shù),即要檢查的變量或值。例如:

var sTemp = "test string";
alert (typeof sTemp);    //輸出 "string"
alert (typeof 86);    //輸出 "number"

對變量或值調(diào)用 typeof 運算符將返回下列值之一:

  • undefined - 如果變量是 Undefined 類型的
  • boolean - 如果變量是 Boolean 類型的
  • number - 如果變量是 Number 類型的
  • string - 如果變量是 String 類型的
  • object - 如果變量是一種引用類型或 Null 類型的

Object類型

除了字符串、數(shù)字、true、false、null和undefined之外,javascript中的值都是對象。js中對象是一組屬性與方法的集合。這里就要說到引用類型了,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起。引用類型有時候也被稱為對象定義,因為它們描述的是一類對象所具有的屬性和方法。

三大引用類型
1.Object類型
我們看到的大多數(shù)類型值都是Object類型的實例,創(chuàng)建Object實例的方式有兩種。

第一種是使用new操作符后跟Object構(gòu)造函數(shù),如下所示

var person = new Object();
person.name = "Micheal";
person.age = 24;

第二種方式是使用對象字面量表示法,如下所示

var person = {
  name : "Micheal",
  age : 24
};

2.Array類型
數(shù)組的每一項可以用來保存任何類型的數(shù)據(jù),也就是說,可以用數(shù)組的第一個位置來保存字符串,第二個位置保存數(shù)值,第三個位置保存對象....另外,數(shù)組的大小是可以動態(tài)調(diào)整的。

創(chuàng)建數(shù)組的基本方式有兩種

第一種是使用Array構(gòu)造函數(shù),如下所示

var colors = new Array("red","blue","yellow");

第二種是使用數(shù)組字面量表示法,如下所示

var colors = ["red","blue","yellow"];

3. Function類型
每個函數(shù)都是Function類型的實例,而且都與其他引用類型一樣具有屬性和方法。函數(shù)通常是使用函數(shù)聲明語法定義的,如下所示

function sum(num1,num2){
  return num1 + num2;
};

這和使用函數(shù)表達式定義函數(shù)的方式相差無幾。

var sun = function (){
  return sum1 + sum2;
};

也就是說,JavaScript按照存儲方式分為基本類型(值類型)引用類型。那么他們的計算有什么區(qū)別呢?

題目1:

var a = 1;
var b = a;

基本類型的復(fù)制就是在棧內(nèi)存中開辟出了一個新的存儲區(qū)域用來存儲新的變量,這個變量有它自己的值,只不過和前面的值一樣,所以如果其中一個的值改變,則不會影響到另一個。

題目2:

var object1 = new Object();
var object2 = object1;

定義了一個對象其實是在棧內(nèi)存中存儲了一個指針,這個指針指向堆內(nèi)存中該對象的存儲地址。復(fù)制給另一個對象的過程其實是把該對象的地址復(fù)制給了另一個對象變量,兩個指針都指向同一個對象,所以若其中一個修改了,則另一個也會改變。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容