數(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_VALUE 和 Number.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ù)制給了另一個對象變量,兩個指針都指向同一個對象,所以若其中一個修改了,則另一個也會改變。