## 2.4 數(shù)據(jù)類型
ECMAScript中有5種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型):`Undefined`、`Null`、`Boolean`、`Number`和`String`。還有1種復(fù)雜數(shù)據(jù)類型--`Object`,`Object`本質(zhì)上是由一組無序的名值對組成的。
注:在ES6中新增了Symbol。
**2.4.1 typeof操作符**
`typeof`操作符用來檢測給定變量的數(shù)據(jù)類型,可能的返回值:
```
"undefined" 這個值未定義
"boolean" 這個值是布爾值
"string" 這個值是字符串
"number" 這個值是數(shù)值
"object" 這個值是對象或null
"function" 這個值是函數(shù)
```
例子:
```
var name = 'tg';
console.log(typeof name); // "string"
console.log(typeof (name)); // "string"
console.log(typeof {}); // "object"
```
`typeof`是一個操作符,后面的圓括號可有可無。
**2.4.2 Undefined類型**
`Undefined`類型只有一個值,即特殊的`undefined`。
如果在使用`var`聲明變量但未對其加以初始化時,這個變量的值就是`undefined`。
```
var name;
console.log(name == undefined); // true
```
對于未聲明過的變量,只能執(zhí)行一項操作,即使用`typeof`操作符檢測其數(shù)據(jù)類型(對未聲明的變量調(diào)用`delete`不會導(dǎo)致錯誤(在非嚴格模式下))
**2.4.3 Null類型**
`Null`類型也是只有一個值的數(shù)據(jù)類型,這個特殊值就是`null`。`null`值可以看作是一個空對象指針。
```
console.log(typeof null); // "object"
```
`undefined`其實是派生自`null`值:
```
console.log(null == undefined); // true
```
注意:null和undefined沒有屬性,甚至連toString()這種標準方法都沒有。
**2.4.4 Boolean類型**
Boolean類型有兩個字面值:true和false,兩個值是區(qū)分大小寫的。
要將一個值轉(zhuǎn)換為其對應(yīng)的Boolean值,可有使用轉(zhuǎn)型函數(shù)Boolean():
```
var name = 'tg';
console.log(Boolean(name); // true
```
可以對任何類型的值調(diào)用Boolean函數(shù),而且總會返回一個Boolean值(true或false)
**轉(zhuǎn)換規(guī)則**:
- 對于true或false,返回原值(true或false)
- 對于String類型的值,任何非空字符串返回true,空字符串("")返回false
- 對于Number類型的值,任何非零數(shù)字值(包括無窮大),返回true;0和NaN返回false
- 對于Object類型的值,任何對象返回true,null返回false
- 對于Undefined類型,undefined返回false(只有一個值)
**2.4.5 Number類型**
最基本的數(shù)值字面量格式是十進制整數(shù)。
```
var num = 15;
```
八進制(以8為基數(shù)) 以0開頭,后面是(0~7)
```
var num = 070; // 八進制的56
```
十六進制(以16為基數(shù)) 以0x開頭,后面是(0~9及A~F),字母A~F可以大小寫。
```
var num = 0xA; //十六進制的10
```
注意:在進行算術(shù)計算時,所有以八進制和十六進制表示的數(shù)值都會被轉(zhuǎn)換成是十進制。
**1.浮點數(shù)值**
`浮點數(shù)值`指包含一個小數(shù)點,并且小數(shù)點后面必須至少有一個數(shù)字。
```
var floatNum = 1.1;
```
保存浮點數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍。
對于那些極大或極小的數(shù)值,我們可以使用科學(xué)計數(shù)法(e表示法)來表示浮點數(shù)值。
e表示法表示的數(shù)值等于e前面的數(shù)值乘以10的指數(shù)次冪:
```
var floatNum = 3.125e7; // 31250000
var floatNum1 = 3e-7; //0.0000003
```
默認情況下,ECMAScript會將那些小數(shù)點后面帶有6個零以上的浮點數(shù)值轉(zhuǎn)換為以e表示的數(shù)值。
```
var floatNum1 = 3e-7; //0.0000003
```
浮點數(shù)的最高精度是17位小數(shù)。
```
0.1 + 0.2 = 0.3000000000000004; // 不是等于0.3
```
**2.數(shù)值范圍**
基于內(nèi)存的限制,ECMAScript只能保存有限的數(shù)值。
ECMAScript能夠表示的最小數(shù)值保存在`Number.MIN_VALUE`(最小值)中,這個值是5e-324;能夠表示的最大數(shù)值保存在`Number.MAX_VALUE`(最大值)中,這個值是1.7976931348623157e+308.
如果某次計算的結(jié)果得到了一個超出JavaScript數(shù)值范圍的值,那么這個數(shù)值就會被轉(zhuǎn)換成特殊的`Infinity`值;如果這個值是負數(shù),則會被轉(zhuǎn)換為-`Infinity`(負無窮),如果這個數(shù)值是整數(shù),則會轉(zhuǎn)換成`Infinity`(正無窮)。
注意:Infinity是不能參與計算的數(shù)值。
用`isFinite()`來判斷這個值是否無窮,該函數(shù)接受一個參數(shù)。如果參數(shù)位于最小與最大數(shù)值之間,返回true。
```
console.log(isFinite(1)); //true
console.log(isFinite(Infinity)); // false
```
**3.NaN**
NaN(Not a Number)表示非數(shù)值,這個數(shù)值用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況。
注意點:
- 任何涉及NaN的操作都會返回NaN。
- NaN與任何值都不相等,包括NaN本身。
```
console.log(NaN == NaN); //false
```
我們可以用`isNaN()`函數(shù)來判斷是否非數(shù)值,該函數(shù)接受一個參數(shù),可以是任何類型。
```
console.log(isNaN(NaN)); // true
```
`isNaN()`在接收到一個值(可以是任何類型)之后,會嘗試將這個值轉(zhuǎn)換為數(shù)值,某些不是數(shù)值的值會直接轉(zhuǎn)換為數(shù)值,比如:字符串"10"或Boolean值。而任何不能被轉(zhuǎn)換為數(shù)值的值都會導(dǎo)致這個函數(shù)返回true。
```
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false
console.log(isNaN('blue')); // true
```
**4.數(shù)值轉(zhuǎn)換**
有3個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:`Number()`、`parseInt()`和`parseFloat()`
轉(zhuǎn)型函數(shù)`Number()`可以用于任何數(shù)據(jù)類型,后面兩個是專門用于把字符串轉(zhuǎn)換為數(shù)值。
**Number()函數(shù)的轉(zhuǎn)換規(guī)則**:
- 如果是Boolean值,true和false將分別轉(zhuǎn)換為1和0
- 如果是數(shù)字值,只是簡單的傳入和返回
- 如果是null值,返回0
- 如果是undefined,返回NaN
- 如果是字符串,遵循下列規(guī)則:
(
* 如果是字符串中只包含數(shù)字(包括前面帶正負號),則將其轉(zhuǎn)換為十進制數(shù)值(前導(dǎo)的零會被忽略)
* 如果字符串中包含有效的浮點格式,如1.1,則將其轉(zhuǎn)換為對應(yīng)的浮點數(shù)值
* 如果字符串中包含有效的十六進制,如0xf,則將其轉(zhuǎn)換為相同大小的十進制數(shù)值
* 如果字符串是空的,返回0
* 如果字符串中包含上述格式以外的字符,返回NaN
)
- 如果是對象,則調(diào)用對象的valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換的結(jié)果是NaN,則調(diào)用對象的toString()方法,然后再次依照前面的規(guī)則轉(zhuǎn)換返回字符串值
```
console.log(Number('tg')); // NaN
console.log(Number('')); // 0
console.log(Number('0011')); // 11
console.log(Number(true)); //1
```
一元加操作符的操作與Number函數(shù)規(guī)則相同。
**parseInt()**
`parseInt()`會忽略字符串前面的空格,直到找到第一個非空格字符。如果第一個字符不是數(shù)字字符或負號,就會返回NaN。如果第一個字符是數(shù)字字符,就會繼續(xù)解析,直到解析完所有后續(xù)字符或者遇到了一個非數(shù)字字符。
`parseInt()`也能識別八進制(在ECMAScript 5中無法識別,將開頭的0當(dāng)作0)和十六進制,最后會轉(zhuǎn)換成十進制。
```
console.log(parseInt('123tg')); // 123
console.log(parseInt('')); // NaN
console.log(parseInt('070')); // 70
console.log(parseInt('0xf')); //15
console.log(parseInt(22.5)); // 22
```
我們還可以為`parseInt()`提供第二個參數(shù),指定需要轉(zhuǎn)換的進制。
```
console.log(parseInt('0xAF',16)); // 175
console.log(parseInt('AF',16)); // 175
console.log(parseInt('AF')); // NaN
console.log(parseInt('070',8)); // 56
console.log(parseInt('70',8)); // 56
```
如果提供了第二個參數(shù),要轉(zhuǎn)換八進制和十六進制時,可省略0和0x。
`parseFloat()`和`parseInt()`類似,也是從第一個字符(位置0)開始解析每個字符,而且一直解析到字符串末尾,或者解析到遇到一個無效的浮點數(shù)字字符為止,換句話說,字符串中的第一個小數(shù)點是有效的,后面的小數(shù)點是無效的,它還會忽略前導(dǎo)的零,只會解析十進制值。
```
console.log(parseFloat('123tg')); // 123
console.log(parseFloat('22.12.4')); // 22.12
console.log(parseFloat('070')); // 70
console.log(parseFloat('0xf')); //0
console.log(parseFloat(22.5)); // 22.5
```
**2.4.6 String類型**
String類型用于表示由零或多個16位Unicode字符組成的字符序列,即字符串。字符串可以由雙引號或單引號表示。
```
var name = 'tg';
```
用雙引號表示的字符串和用單引號表示的字符串完全相同,但要確保引號前后一致,也就是說以雙引號開頭的必須以雙引號結(jié)尾,以單引號開頭的必須以單引號結(jié)尾。
在ECMAScript 3中,字符串直接量必須寫在一行中,而在ECMAScript 5中,字符串直接量可以拆分成數(shù)行,每行必須以反斜杠(\)結(jié)束。
```
// ES 5
'Hello \
world'
```
**1.字符字面量**
String數(shù)據(jù)類型包含了一些特殊的字符字面量,也叫轉(zhuǎn)義序列。
```
\n 換號
\t 制表
\b 空格
\r 回車
\f 進紙
\\ 斜杠
\' 單引號
\" 雙引號
\xnn 以十六進制代碼nn表示的一個字符(n為0~F),比如:\x41表示"A"
\unnn 以十六進制代碼nnnn表示的一個Unicode字符(n為0~F)。比如:\u03a3表示Σ
```
這些字符字面量可以出現(xiàn)在字符串中的任意位置,會被當(dāng)做**一個字符**來解析。
```
var name = 'tg\u03a3';
console.log(name); //tgΣ
console.log(name.length); // 3
```
任何字符串的長度都可以訪問其length屬性取得。
**2.字符串的特點**
ECMAScript中的字符串是不可變的。一旦創(chuàng)建,值就不會改變。
**后臺邏輯**:要改變某個變量保存的字符串,首先要銷毀原來的字符串,然后用另一個包含新值的字符串填充該變量。
**3.轉(zhuǎn)換為字符串**
要將一個值轉(zhuǎn)換為字符串有兩種方式:
- 使用每個值(null和undefined除外)都有的`toString()`方法
```
var age = 1;
console.log(age.toString()); // "1"
```
我們還可以給`toString()`傳入一個參數(shù),輸出數(shù)值的基數(shù)。
```
var num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // 1010
console.log(num.toString(8)); // 12
```
- 可以使用轉(zhuǎn)型函數(shù)String(),能將任何類型的值轉(zhuǎn)換為字符串,轉(zhuǎn)換規(guī)則:
如果值有toString()方法,則調(diào)用該方法并返回相應(yīng)的結(jié)果
如果值是null,則返回null
如果值是undefined,則返回undefined
```
console.log(String(10)); // "10"
console.log(String(true)); // "true"
console.log(String(null)); // "null"
console.log(String(undefined)); // "undefined"
```
要把某個值轉(zhuǎn)為字符串,還可以使用加號操作符:
```
console.log( true + ''); // "true"
```
**2.4.7 Object類型**
ECMAScript中的對象其實就是一組數(shù)據(jù)和功能的集合。
對象可通過執(zhí)行new操作符后跟創(chuàng)建的對象類型的名稱來創(chuàng)建。
```
var o = new Object();
```
如果不傳參,可以省略后面的圓括號(不推薦)。
```
var o = new Object;
```
在ECMAScript中,`Object`類型是所有對象的基礎(chǔ)。
`Object`的每個實例都具有下列屬性和方法:
- `Constructor`:保存著用于創(chuàng)建當(dāng)前對象的函數(shù),比如上面的例子,構(gòu)造函數(shù)就是Object()
- `hasOwnProperty(propertyName)`:用于檢查給定的屬性在當(dāng)前對象實例中是否存在(而不是在實例的原型中),參數(shù)必須是字符串形式
- `isPrototypeOf(object)`:用于檢查傳入的對象是否是另一個對象的原型
- `propertyIsEnumerable(propertyName)`:用于檢查給定的屬性是否能夠使用for-in語句來枚舉,參數(shù)必須是字符串形式
- `toLocaleString()`:返回對象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對應(yīng)
- `toString()`:返回對象的字符串表
- `valueOf()`:返回對象的字符串、數(shù)值或布爾值表示,通常和toString()返回的值相同
- 前言
- JavaScript簡介
- 基本概念
- 語法
- 數(shù)據(jù)類型
- 運算符
- 表達式
- 語句
- 對象
- 數(shù)組
- 函數(shù)
- 引用類型(對象)
- Object對象
- Array對象
- Date對象
- RegExp對象
- 基本包裝類型(Boolean、Number、String)
- 單體內(nèi)置對象(Global、Math)
- console對象
- DOM
- DOM-屬性和CSS
- BOM
- Event 事件
- 正則表達式
- JSON
- AJAX
- 表單和富文本編輯器
- 表單
- 富文本編輯器
- canvas
- 離線應(yīng)用
- 客戶端存儲(Cookie、Storage、IndexedDB)
- HTML5 API
- Video/Audio
- Geolocation API
- requestAnimationFrame
- File API
- FullScreen API
- IndexedDB
- 檢測設(shè)備方向
- Blob
- vibrate
- Luminosity API
- WebRTC
- Page Visibility API
- Performance API
- Web Speech
- Notification
- 面向?qū)ο蟮某绦蛟O(shè)計
- 概述
- this關(guān)鍵字
- 原型鏈
- 作用域
- 常用API合集
- SVG
- 錯誤處理機制
- JavaScript開發(fā)技巧合集
- 編程風(fēng)格
- 垃圾回收機制
