JavaScript學習總結(一):數據類型詳解

學習一門編程語言,首先要搞清楚其基本語法。就像是看一本小說,首先需要知道主人公是誰。

一、變量

如果說JavaScript是一本小說的話,那么主角一定是變量。它是如何使用這門語言的關鍵。和其他編程語言有所不同,JavaScript中的變量是松散類型的,可以用來保存任何類型的數據。
定義一個變量,就像是給小說的主人公起名字一樣容易:var message = hi;
一本小說當然不可能只有主角,其他角色也很關鍵。而變量當然也不止一個。因此,可以使用一條語句定義多個變量。

var message = "hi";
    found = false;
    age = 6;

二、數據類型

在JavaScript中,總共有6種數據類型。

  • 簡單數據類型:
    1. undefined(未定義)
    2. Boolean(布爾值)
    3. string(字符串)
    4. number(數值)
    5. Null(空)
  • 復雜數據類型:
  • object(對象)

那么,如何知道一個數據的數據類型呢?

1、typeof操作符

對一個值使用typeof操作符,通過返回的字符串便可以得知這個值的數據類型。
例如:

alert(typeof 66); // "number"
alert(typeof "star");// "string"

調用typeof null會返回“object”,這是因為null是一個特殊值,被認為是一個空的對象的引用。但調用typeof function 卻會返回“function”,雖然函數在ECMAscript中是對象,不是一種數據類型,但是函數有一些特殊的屬性,所以用typeof區分函數和其他對象是有必要的。

2、undefined類型

undefined,如同它的字面意思,就是“未定義”。在使用var聲明變量但未對其進行初始化的時候,這個變量的值就是undefined。

var i;
alert(i); // "undefined"

但要注意一點,沒有使用var聲明的變量,雖然也可以使用typeof操作符返回undefined值,但這樣會造成一個問題:當我們對一個變量使用typeof操作符, 如果返回了undefined,卻無法得知這個變量是否被聲明,因此,使用變量前一定要聲明變量。

3、Null類型

Null也只有一個值,這個值是null。用typeof檢測null值時會返回object,因為null表示一個空對象指針。
Null值實際上和undefined有這樣的關系:
alert(null == undefined); // true
undefined值是派生自null值的,因此返回了true,但二者實際上用途完全不同。

4、Boolean類型

說到Boolean類型,給人的第一感覺是簡單明確,只有兩個值true和false。true代表真,false代表假,布爾值非真既假,簡單粗暴,不像我們所處的世界,除了正義和邪惡之外,還有夾雜在二者之間的灰色地帶,說不清道不明。
將一個值轉化為其對應的Boolean值,可以調用轉型函數Boolean()。
var a = "star";
var aAsBoolean = Boolean(a);
調用之后返回的值是true還是false,取決于要轉換值的數據類型和實際值。

5、Number類型

ECMA-262(JavaScript標準)定義了不同的數值字面量格式。

  • 十進制:
    var num = 66;
  • 八進制:
    var num = 070 // 56
  • 十六進制:
    var num = 0xA; //10
    在進行算術運算時,所有以八進制和十六進制表示的數值最終都將被轉換成十進制數值。
    保存浮點數值和整數值不同,浮點數值必須要有一個小數點,所需要的內存空間是整數值的兩倍。
    使用浮點數值:
    var num = 0.1;
    對于極大或極小的數值,可以用e表示法表示:
    var floatNum = 3.125e7; //31250000
    var floatNum = 3E-17;// 0.00000000000000003
    雖然浮點數最高精度是17位小數,但使用JavaScript進行算術計算時會出現一定的誤差,比如0.1+0.2:
    alert(0.1 + 0.2); //0.30000000000000004
    0.1+0.2并沒有返回0.3,這是為什么呢?
    在網上查找相關的資料中解釋如下:

JavaScript的number類型按照ECMA的JavaScript標準,它的Number類型就是IEEE 754的雙精度數值,相當于java的double類型。IEEE 754標準《二進制浮點數算法》(www.ieee.org)就是一個對實數進行計算機編碼的標準。因此精度問題不止JS這門語言獨有。
無論是用紙張記錄數值,還是用計算機記錄數值,都必須用某種編碼方案來表達數值。必須理解的是,用編碼表達的數值不是數值本身,而只是數值的一種人類或計算機可理解的描述。任何編碼方案都有其局限,要么是表達范圍(精度)方面的限制,要么是其他復雜性方面的制約。
絕對完美的數值編碼方案是不存在的,為了處理方便,這個標準引入了大量的折衷和妥協,建立在這種表達方式上的算法(例如除法運算)也一樣。由于數值表達方式存在“缺陷”,運算結果不可避免地堆聚起越來越多的誤差。
按IEEE 754格式保存的浮點數精度相當于帶有15、16或17位小數位數的十進制小數,由于存在二進制和十進制的轉換問題,具體的位數會發生變化。要獲得最高的轉換精度,必須指定17位的小數——此時可以相信前15位的精度。
在JavaScript中輸出下面這些數值(注意不能作為字符串輸出):0.1000000000000000000000000001(28位小數)、0.100000000000000000000000001(27位小數)、0.1000000000000000000000000456(28位小數)、0.09999999999999999999999(23位小數),顯示出來的結果都是數值0.1。又如,如果輸出1/3的有理數表達式,結果是0.3333333333333333。
因此JavaScript小數在做四則運算時,精度會丟失。當然也有一些方法可以來保證一定的精度:http://jiangzhengjun.iteye.com/blog/4...也有人總結了一些原則:
原則
■ 大多數Web頁面不需要小數 避免使用小數,盡量設法使用整數。確保數組的索引都是整數。按分(而不是元)計算金額。百分比放大100倍計算以避免出現小數。盡可能不用除法(/)和模(%)運算,因為大多數情況下它們直接導致出現浮點數。如果必須使用除法,立即用Math.round方法回歸整數運算。
■ 如果必須使用浮點數,則盡可能引入冗余小數位——即在程序要求的運算精度之外,再增加小數位 如果程序需要5位數字的小數精度,則在運算中至少保留6位的小數,8位更好。冗余位越多,累計誤差的影響越小。
■ 避免在同一個表達式中使用相差太大或太小的數值 對兩個非常接近的數值執行減法或比較操作很容易出錯。將很小的數值和很大數值相加無異于浪費時間,小的數值很可能被當作0。不過,很小的數值乘以很大的數值一般不會出現問題,例如2 * 12345678會得到正確的結果24691356。但是,0.1 - 0.09的結果是0.010000000000000009。
■ 用isFinite()和isNaN()檢查運算結果 通過表單提交任何數值運算結果之前,一定要先檢查數據的合法性。
■ 慎用數值運算 程序涉及的數值運算越少,引入誤差的可能就越小。視浮點數為貴客,不可任意驅使。

因為內存的限制,ECMAscript有一個最大值和最小值,如果超出這個范圍內的值,則會被表示成Infinity(負數是-infinity)。若想看一個值是否介于這個范圍之內,可以使用isFinite()函數。

還有一個特殊的值:NaN。這個值表示非數值,即一個本來要返回數值的操作數未返回數值的情況。
NaN有兩個非同尋常的特點:

  • NaN !== NaN
  • 任何涉及NaN的操作,比如NaN/10,都會返回NaN。
    而isNaN()函數可以幫我們確定一個數值是否是NaN,也就是是否“不是數值”。

數值轉換,有三個函數可以把非數值轉換成數值:Number()、parseInt()、parseFloat()。

6、string類型

string類型用于表示由0或多個16位Unicode字符組成的字符序列,即字符串。
字符串用單引號‘’和雙引號“”表示都可以,但引號必須匹配,不能左邊單引號右邊雙引號。
任何字符串的長度可以用length屬性獲得:

var str = 'hello world';
alert(str.length);

如果想把一個值轉換成字符串,可以使用兩種方法:

  • toString()方法
    幾乎每個值都有這個方法,但null和undefined沒有這個方法。
  • String()轉型函數
    在不知道要轉換的值是否是null或undefined時,可以使用這個轉型函數,可以將任何值轉換為字符串。
    如果是null,則返回null。
    如果是undefined,則返回undefined。

7、object類型

對象,實際上就是一組數據和功能的集合。在ECMAscript中,object類型是所有它的實例的基礎,這也就是為什么說JavaScript中萬物皆對象。

由于對象既關鍵又復雜,這里不再贅述,將會在之后專門的文章中總結對象相關的知識。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容