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