JavaScript中的數據類型回顧

一、標識符(Names)

標識符由一個字母、下劃線和美圓符開頭,其後能夠選擇性的加上一個或多個字母、數字或下劃線。標識符不能使用下面這些保留字:java

abstract
boolean、break、byte
case、catch、char、class、const、continue
debugger、default、delete、do、double
else、enume、export、extends
false、final、finally、float、for、function
goto
if、implement、import、in、instanceof、int、interface
long
native、new、null
package、private、protected、public
return
short、static、supper、switch、synchronized
this、throw、throws、transient、true、try、typeof
var、volatile、void
while、with

在這個列表中大部分保留字還沒有在這門語言中使用。這個列表不包括一些本應該被保留而沒有保留的字,諸如undefined、NaN和Infinity。JavaScript不容許使用保留字來命名變量或參數。更糟糕的餓是,JavaScript不遜雨在對象字面量中,或者用點運算符提取對象屬性時,使用保留字做爲對象的屬性名。git

標識符被用於語句、變量、參數、屬性名、運算符和標記。github

二、數值(Numbers)

與其餘任邊吃語言同樣,JavaScript能夠處理諸如數據或文本的值。一門語言可使用的值的類型,稱爲該語言的數據類型。JavaScript支持基本的數值和字符串的數據類型。在JavaScript中,全部數值都是64位雙精度的,取值範圍從-5e-324到1.7976931348623157e308。也就是說,在JavaScript中整數和浮點數之間並無什麼區別,兩者都是數值。下面的例子使用了typeof操做符進行演示:正則表達式

> typeof 1;
"number"
> typeof 1.5;
"number"

全部JavaScript數值都是按照IEEE-754雙精度二進制數標準進行表示。當執行算術運算時應該注意一些問題。例如,在把兩個數值相加時,在你的腦海中這是一個通用的操做,然而在JavaScript中可能會得到使人大感意外的結果,下面的代碼演示看着一問題:app

> .1 + .2;
0.30000000000000004

JavaScript沒有內置的十進制數據類型,但JavaScript爲數值提供了兩個方法:toPrecision和toFixed,這兩個方法能夠按照固定位數的小數來格式化數值。下面的代碼演示了着兩個方法的使用:函數

> var num = 1234.123454321;
> num.toFixed(2);
"1234.12"
> var num2 = 1234.123454321;
> num2.toPrecision(8);
"1234.1235"

若是使用了一個超出64位範圍的數值,或者得到一個超出64位範圍的值,JavaScript將返回一個特殊的值:Infinity(無窮大)或者-Infinity(負無窮大)。除數爲0將返回Infinity。其餘特殊值還包括NaN,他表示一個「非數值」,她是一個容易產生錯誤的值,經常是一些BUG的根源。網站

當試圖將一個無效字符串對象轉換爲一個數值時,結果爲NaN值。NaN具備「毒性」,在NaN值與數值之間執行一個操做將返回一個NaN值。可使用內置的isNaN()函數來檢查一個變量是不是NaN值。this

> 10 * 1 + 100 - 1 -NaN;
NaN
> var x = NaN;
> isNaN(x);
true

JavaScript支持八進制(基數爲8)和十六進制(基數爲16)。八進制字面值用一個0(即零)做爲前綴,十六進制數值則以一個x做爲前綴。debug

JavaScript內置Math對象用於常見的數學運算。例如,可使用Math.round()方法得到兩位數的精度。code

> Math.round( (.1+.2)*100)/100;
0.3

充分利用內置對象能夠節省時間、提升效率。

三、字符串(Strings)

字符串是一個由0個或多個16位的Unicode字符組成的系列,使用單引號或雙引號將字符串括起。這裏強調它是Unicode字符,是出於國際化環境中使用JavaScript的重要性。JavaScript中沒有爲字符串定義特殊的數據類型。字符串也是(不可變)對象,一旦被建立,就永遠沒法改變它。但你能夠很容易的經過 + 運算符鏈接其餘字符串來建立一個新字符串。兩個包含着徹底相同的字符且字符順序也相同的字符串被認爲是相同的字符串。因此:

> 'c' + 'a' + 't' === 'cat';
true

字符串是對象,所以字符串具備一些相應的屬性和方法。字符串有一個length屬性。例如,"JavaScript".length是10;再好比下面的代碼:

> 'test String'.indexOf('s');
2
> 'test String'.charAt(5);
"S"

咱們也能夠擴展內置的String對象以知足開發人員的須要。

四、布爾(Boolean)

Boolean類型表示true值和false值。在適當的上下文中,好比在一個if語句中,任何條件判斷的值都將被轉換爲Boolean值以判斷「真」或「假」。在判斷條件中,空字符串、NaN值、null、undefined、數值0和關鍵字false都將被計算爲false,其它的任何值都將被解析爲true。

if('') {
  console.log('something happens');
} else {
  console.log('nothing happens');
}
//輸出:nothing happens

JavaScript支持的布爾操做包括:邏輯與(&&)、邏輯或(||)和邏輯非(!)。在不少常見任務中,布爾操做對於檢驗要求輸入的字符串很是有用。

function validate(){
    var name_input = 'java';
    var age_input;
    return name_input && age_input;
}
if(validate()){
    console.log('pass');
} else {
    console.log('fail');
}
//輸出 fail

NaN值表示一個非數值的值,但你若是輸入下面的代碼,結果將會很奇怪:

> typeof NaN;
"number"

這是typeof操做符奇怪的行爲之一。

五、類型比較

JavaScript具備等於(==)操做符和等同(===)操做符。==操做符是危險的,由於它在執行比較以前,強制執行類型轉換。例如:

> 1 == '1';
true

顯然,這不是咱們想要的比較結果。若是左操做數和右操做數真正徹底相同,===操做符纔會返回true。

> 1 === '1';
false

對應的還有!=和!==操做符,請老是使用===和!==操做符。

六、日期(Data)

JavaScript內置了Date對象,可使用new操做符和Date()構造函數來建立Date對象,Date對象用於表示日期和時間。不帶任何參數建立一個新的Date對象,得到的是一個表示當前日期和時間的Date對象。

> var thisMoment = new Date();
> console.log(thisMoment);
Date {Sun Aug 30 2015 10:47:14 GMT+0800}
> thisMoment.getFullYear();
2015

雖然Date是一個方便的對象,瞭解該對象固然仍是有用的。強烈建議使用開源的Date.js庫來執行日期/時間的計算,能夠從https://github.com/datejs/Datejs找到該js庫,datajs官方網站如今已經沒法打開,返回503狀態。

七、其餘類型

聲明一個變量時未對其賦值,或者訪問了一個不存在的對象屬性,結果都會產生一個稱爲undefined的類型。null時JavaScript的一個內置對象,它表示沒有值。在執行比較操做時,undefined和null兩者都被裝換成false值,可是最好避免使用undefined。在不少JavaScript解析器中,undefined是能夠從新賦值的,於是可能會產生存在弊病的代碼:

undefined = true;
if(undefined){
    console.log('騙你!');
}
//輸出:騙你!

下面列出了JavaScript支持的各類數據類型。正則表達式,或稱爲RegEx不在這裏介紹。

  • Number

  • String

  • Boolean

  • Object

  • Function

  • Array

  • Date

  • RegEx

  • Null

  • Undefined

在使用try/catch語句時,某些附加的內置error類型是很是有用的。一般在throw語句中建立error對象。

try{
    throw new Error('很是糟糕的事情發生了!');
}catch(e){
    console.log(e.name + ':' + e.message);
}
//輸出:Error:很是糟糕的事情發生了!

下面的列表列出了各類不一樣的error類型

  • Error

  • EvalError

  • RangError

  • ReferenceError

  • SyntaxError

  • TypeError

  • URIError

對於我來講,最多見的莫過於SyntaxError這個經典的語法錯誤,太熟悉了。

相關文章
相關標籤/搜索