學習一門編程語言官还,首先要搞清楚其基本語法。就像是看一本小說毒坛,首先需要知道主人公是誰望伦。
一、變量
如果說JavaScript是一本小說的話煎殷,那么主角一定是變量屯伞。它是如何使用這門語言的關鍵。和其他編程語言有所不同豪直,JavaScript中的變量是松散類型的劣摇,可以用來保存任何類型的數(shù)據(jù)。
定義一個變量弓乙,就像是給小說的主人公起名字一樣容易:var message = hi;
一本小說當然不可能只有主角末融,其他角色也很關鍵。而變量當然也不止一個暇韧。因此勾习,可以使用一條語句定義多個變量。
var message = "hi";
found = false;
age = 6;
二锨咙、數(shù)據(jù)類型
在JavaScript中语卤,總共有6種數(shù)據(jù)類型。
- 簡單數(shù)據(jù)類型:
- undefined(未定義)
- Boolean(布爾值)
- string(字符串)
- number(數(shù)值)
- 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中萬物皆對象。
由于對象既關鍵又復雜咐蝇,這里不再贅述涯鲁,將會在之后專門的文章中總結對象相關的知識巷查。