我們知道JavaScript有ECMAScript、DOM、BOM三部分組成,下面一幅圖可以簡單明了的說明JavaScript的組成。

注:ECMAScript(European Computer Manufacturers Association)是由一種Ecma國際前身為歐洲計(jì)算機(jī)制造商協(xié)會(huì)制定的標(biāo)準(zhǔn)。簡單來說,ECMAScript不是一門語言,而是一個(gè)標(biāo)準(zhǔn)。
ECMAScript中有5種簡單數(shù)據(jù)類型,也稱為基本數(shù)據(jù)類型:Undefined、Null、Boolean、String、Number。學(xué)習(xí)這些之前,需要先了解typeof操作符。
typeof的作用是判斷給定數(shù)據(jù)的類型。具體用法見下面代碼:
//1: typeof(直接量/變量)
console.log(typeof ("哈哈哈")); // string
console.log(typeof(13)); // number
// 2: typeof 直接量/變量
console.log(typeof "你好"); // string
console.log(typeof 23); // number
一、Undefined類型
Undefined類型只有一個(gè)值undefined,如果一個(gè)變量只有聲明,沒有賦值,那它的結(jié)果就是undefined,頁面上不會(huì)報(bào)錯(cuò)。
對(duì)于尚未聲明的對(duì)象,只能執(zhí)行一項(xiàng)操作,即使用typeof操作符檢測(cè)其數(shù)據(jù)類型。
<script type="text/javascript">
// 如果一個(gè)變量只有聲明,沒有賦值,那它的結(jié)果就是undefined,頁面上不會(huì)報(bào)錯(cuò)
var a;
console.log(a); // undefined
console.log(typeof a); // undefined
var b
console.log(typeof b); // undefined
</script>
結(jié)果表明:對(duì)未初始化和未聲明的變量執(zhí)行typeof操作都返回了undefined值。
二、Null類型
Null類型:空對(duì)象,也是只有一個(gè)值:null。從邏輯角度講,null值表示一個(gè)空對(duì)象指針,而這也正是使用typeof操作符檢測(cè)其類型返回"object"的原因。undefined是派生自null,所以,它們相等性測(cè)試結(jié)果返回true。它有一個(gè)很常用的用處:如果定義的變量準(zhǔn)備在將來用于保存對(duì)象,那么最好將該變量初始化為null。
<script>
console.log(typeof null); // object
var a = null;
if (a) {
alert("true");
} else {
alert("false");
} // 返回false
if (null == undefined) {
console.log("undefined值是派生自null")
}
</script>
三、Boolean類型
Boolean類型有兩個(gè)字面值,分別是true、false。雖然它只有兩個(gè)值,但是任何類型都可以轉(zhuǎn)換成Boolean,數(shù)據(jù)類型及其轉(zhuǎn)換規(guī)則如下圖:

總結(jié)出來即是:除了false、""、NAN、0、Undefined、Null轉(zhuǎn)換為Boolean的時(shí)候結(jié)果是false,其余都是true。
四、String類型
1、String:即字符串,簡單來說就是用引號(hào)引起來的文本,可以是單引號(hào),也可以是雙引號(hào)。字符串長度用length表示。ECMAScript中的字符串是不可變的,也就是說,字符串一旦創(chuàng)建,它的值就不能改變,如果改變了字符串,編譯不會(huì)出現(xiàn)問題,但是內(nèi)存會(huì)出現(xiàn)問題,特別影響性能。
要改變某個(gè)變量保存的字符串,首先要銷毀原來的字符串,然后再用另一個(gè)包含新值的字符串填充該變量,例如:
var str = "12"; str = str + "ab";
2、字符字面量:String類型包含一些特殊的字符字面量,也叫轉(zhuǎn)義字符,比如\n表示換行、\b表示退格、\表示斜杠、'表示單引號(hào)、''表示雙引號(hào)等。如果字符串中,包含雙字節(jié)字符,length屬性可能不會(huì)精確地返回字符串中的字符數(shù)目。
3、如果字符串中出現(xiàn)引號(hào):
- 如果字符串中出現(xiàn)雙引號(hào),可以把字符串的引號(hào)改成單引,反之,亦然
- 使用轉(zhuǎn)義符
<script>
// 括號(hào)里面直接用的數(shù)據(jù),叫做直接量
alert("123");
alert("1abv");
alert('你好');
// alert(abc); // 不是字符串,控制臺(tái)會(huì)出現(xiàn)報(bào)錯(cuò)
alert("我說:“你好”"); //不會(huì)出錯(cuò)
// alert("you say:"today is a good day""); // 會(huì)報(bào)錯(cuò),可以改成如下
alert('you say:"today is a good day"');
alert("you say: \n \'hello\ \"world\" \b \"你好\"");
</script>
五、Number類型
1、Number類型即是數(shù)值,分為浮點(diǎn)數(shù)值和整數(shù)數(shù)值,這里不再做過多說明,下面講一下數(shù)值范圍。
由于內(nèi)存限制,ECMAScript并不能保存所有的數(shù)值類型,最小值保存在Number.MIN_VALUE,最大值保存Number_MAX_VALUE中,如果超過范圍,會(huì)被自動(dòng)轉(zhuǎn)換成特殊的inFinity(正無窮)和-inFinity(負(fù)無窮)??梢杂胕sFinite()函數(shù)來判斷數(shù)值是否在最大值和最小值之間。
<script>
console.log(isFinite(123)); // true
var s = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(s)); // false
console.log(maxSum); // infinity(正無窮)
</script>
2、NaN
NaN(not a number)即非數(shù)值,是number的一種,用來表示數(shù)值的一種不正常的狀態(tài),一般情況下,會(huì)在數(shù)值計(jì)算錯(cuò)誤的時(shí)候出現(xiàn),它特殊到自己不等于自己。判斷當(dāng)前的數(shù)據(jù)是否是NaN的函數(shù)isNaN(),參數(shù)可以是任何數(shù)值,該函數(shù)可以幫確定這個(gè)參數(shù)是否“不是數(shù)值”,它在接到一個(gè)參數(shù)后,會(huì)嘗試將這個(gè)值轉(zhuǎn)換為數(shù)值,,函數(shù)返回false。某些不是數(shù)值的值會(huì)直接轉(zhuǎn)換為數(shù)值,而不能被轉(zhuǎn)換成數(shù)值的參數(shù),會(huì)導(dǎo)致這個(gè)函數(shù)返回true。
<script>
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false(10是一個(gè)數(shù)值)
console.log(isNaN("10")); // false(可以被轉(zhuǎn)換成數(shù)值10)
console.log(isNaN(true)); // false (可以被轉(zhuǎn)換常數(shù)值1)
console.log(isNaN(false)); // false(可以被轉(zhuǎn)換成數(shù)值0)
console.log(isNaN("你好")); // true(不能被轉(zhuǎn)換成數(shù)值)
</script>
六、String、Number使用注意
- 如果兩個(gè)字符串用+相連,那加號(hào)的作用是連接這兩個(gè)字符串
- 如果兩個(gè)數(shù)值用+相連,那么加號(hào)的作用是兩個(gè)數(shù)值相加
- 如果加號(hào)連接的兩個(gè)直接量中有一個(gè)是字符串,那么作用就是連接
<script>
console.log("我+sayHi"); // 我+nihai
console.log("我"+"sayHi"); // 我nihai
var a = 123;
var b = "123";
console.log(a + a + a + b); // string "369123"
console.log(b + a + a + a); // string "123123123123"
</script>