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

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

一、變量

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

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

二锨咙、數(shù)據(jù)類型

在JavaScript中语卤,總共有6種數(shù)據(jù)類型。

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

那么酪刀,如何知道一個數(shù)據(jù)的數(shù)據(jù)類型呢粹舵?

1、typeof操作符

對一個值使用typeof操作符骂倘,通過返回的字符串便可以得知這個值的數(shù)據(jù)類型眼滤。
例如:

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

調(diào)用typeof null會返回“object”,這是因為null是一個特殊值历涝,被認為是一個空的對象的引用诅需。但調(diào)用typeof function 卻會返回“function”,雖然函數(shù)在ECMAscript中是對象荧库,不是一種數(shù)據(jù)類型堰塌,但是函數(shù)有一些特殊的屬性,所以用typeof區(qū)分函數(shù)和其他對象是有必要的分衫。

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代表假芥挣,布爾值非真既假,簡單粗暴耻台,不像我們所處的世界空免,除了正義和邪惡之外,還有夾雜在二者之間的灰色地帶盆耽,說不清道不明蹋砚。
將一個值轉(zhuǎn)化為其對應的Boolean值,可以調(diào)用轉(zhuǎn)型函數(shù)Boolean()摄杂。
var a = "star";
var aAsBoolean = Boolean(a);
調(diào)用之后返回的值是true還是false坝咐,取決于要轉(zhuǎn)換值的數(shù)據(jù)類型和實際值。

5析恢、Number類型

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

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

JavaScript的number類型按照ECMA的JavaScript標準,它的Number類型就是IEEE 754的雙精度數(shù)值专筷,相當于java的double類型弱贼。IEEE 754標準《二進制浮點數(shù)算法》(www.ieee.org)就是一個對實數(shù)進行計算機編碼的標準。因此精度問題不止JS這門語言獨有磷蛹。
無論是用紙張記錄數(shù)值吮旅,還是用計算機記錄數(shù)值,都必須用某種編碼方案來表達數(shù)值味咳。必須理解的是庇勃,用編碼表達的數(shù)值不是數(shù)值本身,而只是數(shù)值的一種人類或計算機可理解的描述槽驶。任何編碼方案都有其局限责嚷,要么是表達范圍(精度)方面的限制,要么是其他復雜性方面的制約掂铐。
絕對完美的數(shù)值編碼方案是不存在的罕拂,為了處理方便,這個標準引入了大量的折衷和妥協(xié)全陨,建立在這種表達方式上的算法(例如除法運算)也一樣爆班。由于數(shù)值表達方式存在“缺陷”,運算結果不可避免地堆聚起越來越多的誤差烤镐。
按IEEE 754格式保存的浮點數(shù)精度相當于帶有15蛋济、16或17位小數(shù)位數(shù)的十進制小數(shù),由于存在二進制和十進制的轉(zhuǎn)換問題炮叶,具體的位數(shù)會發(fā)生變化碗旅。要獲得最高的轉(zhuǎn)換精度,必須指定17位的小數(shù)——此時可以相信前15位的精度镜悉。
在JavaScript中輸出下面這些數(shù)值(注意不能作為字符串輸出):0.1000000000000000000000000001(28位小數(shù))祟辟、0.100000000000000000000000001(27位小數(shù))、0.1000000000000000000000000456(28位小數(shù))侣肄、0.09999999999999999999999(23位小數(shù))旧困,顯示出來的結果都是數(shù)值0.1。又如,如果輸出1/3的有理數(shù)表達式吼具,結果是0.3333333333333333僚纷。
因此JavaScript小數(shù)在做四則運算時,精度會丟失拗盒。當然也有一些方法可以來保證一定的精度:http://jiangzhengjun.iteye.com/blog/4...也有人總結了一些原則:
原則
■ 大多數(shù)Web頁面不需要小數(shù) 避免使用小數(shù)怖竭,盡量設法使用整數(shù)。確保數(shù)組的索引都是整數(shù)陡蝇。按分(而不是元)計算金額痊臭。百分比放大100倍計算以避免出現(xiàn)小數(shù)。盡可能不用除法(/)和模(%)運算登夫,因為大多數(shù)情況下它們直接導致出現(xiàn)浮點數(shù)广匙。如果必須使用除法,立即用Math.round方法回歸整數(shù)運算恼策。
■ 如果必須使用浮點數(shù)鸦致,則盡可能引入冗余小數(shù)位——即在程序要求的運算精度之外,再增加小數(shù)位 如果程序需要5位數(shù)字的小數(shù)精度涣楷,則在運算中至少保留6位的小數(shù)蹋凝,8位更好。冗余位越多总棵,累計誤差的影響越小。
■ 避免在同一個表達式中使用相差太大或太小的數(shù)值 對兩個非常接近的數(shù)值執(zhí)行減法或比較操作很容易出錯改含。將很小的數(shù)值和很大數(shù)值相加無異于浪費時間情龄,小的數(shù)值很可能被當作0。不過捍壤,很小的數(shù)值乘以很大的數(shù)值一般不會出現(xiàn)問題骤视,例如2 * 12345678會得到正確的結果24691356。但是鹃觉,0.1 - 0.09的結果是0.010000000000000009专酗。
■ 用isFinite()和isNaN()檢查運算結果 通過表單提交任何數(shù)值運算結果之前,一定要先檢查數(shù)據(jù)的合法性盗扇。
■ 慎用數(shù)值運算 程序涉及的數(shù)值運算越少祷肯,引入誤差的可能就越小。視浮點數(shù)為貴客疗隶,不可任意驅(qū)使佑笋。

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

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

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

數(shù)值轉(zhuǎn)換横堡,有三個函數(shù)可以把非數(shù)值轉(zhuǎn)換成數(shù)值:Number()、parseInt()冠桃、parseFloat()命贴。

6、string類型

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

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

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

  • toString()方法
    幾乎每個值都有這個方法迹蛤,但null和undefined沒有這個方法民珍。
  • String()轉(zhuǎn)型函數(shù)
    在不知道要轉(zhuǎn)換的值是否是null或undefined時,可以使用這個轉(zhuǎn)型函數(shù)盗飒,可以將任何值轉(zhuǎn)換為字符串嚷量。
    如果是null,則返回null逆趣。
    如果是undefined蝶溶,則返回undefined。

7宣渗、object類型

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

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抹腿,隨后出現(xiàn)的幾起案子岛请,更是在濱河造成了極大的恐慌,老刑警劉巖警绩,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崇败,死亡現(xiàn)場離奇詭異,居然都是意外死亡肩祥,警方通過查閱死者的電腦和手機后室,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來混狠,“玉大人岸霹,你說我怎么就攤上這事〗龋” “怎么了贡避?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長予弧。 經(jīng)常有香客問我刮吧,道長,這世上最難降的妖魔是什么掖蛤? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任杀捻,我火速辦了婚禮,結果婚禮上蚓庭,老公的妹妹穿的比我還像新娘水醋。我一直安慰自己,他們只是感情好彪置,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝇恶,像睡著了一般拳魁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撮弧,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天潘懊,我揣著相機與錄音,去河邊找鬼贿衍。 笑死授舟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的贸辈。 我是一名探鬼主播释树,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奢啥?” 一聲冷哼從身側響起秸仙,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桩盲,沒想到半個月后寂纪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赌结,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年捞蛋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬姚。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡拟杉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伤靠,到底是詐尸還是另有隱情捣域,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布宴合,位于F島的核電站焕梅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏卦洽。R本人自食惡果不足惜贞言,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阀蒂。 院中可真熱鬧该窗,春花似錦、人聲如沸蚤霞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昧绣。三九已至规肴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夜畴,已是汗流浹背拖刃。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贪绘,地道東北人兑牡。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像税灌,于是被迫代替她去往敵國和親均函。 傳聞我的和親對象是個殘疾皇子亿虽,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容