1.1 語法
1.1.1 區(qū)分大小寫
ECMAScript中的一切(變量蛾洛、函數(shù)名和操作符)都區(qū)分大小寫。
1.1.2 標(biāo)識(shí)符
所謂標(biāo)識(shí)符剧劝,就是指變量、函數(shù)抓歼、屬性的名字讥此,或者函數(shù)的參數(shù)拢锹。
- 第一個(gè)字符必須是一個(gè)字母、下劃線(_)或一個(gè)美元字符($)
- 其他字符可以是字母萄喳、下劃線卒稳、美元符號(hào)或數(shù)字
** 最佳實(shí)踐:標(biāo)識(shí)符采用駝峰大小寫格式(即第一個(gè)字母小寫,剩下的每個(gè)單詞的首字母大寫) **
1.2 變量
var
操作符定義的變量將成為定義該變量的作用域中的局部變量他巨。不過充坑,假如省略var
操作符,將會(huì)創(chuàng)建一個(gè)全局變量染突。
1.3 數(shù)據(jù)類型
ECMAScript中有5種簡單數(shù)據(jù)類型:
- Undefined
- Null
- Boolean
- Number
- String
1.3.1 typeof 操作符
- "undefined"——如果這個(gè)值未定義捻爷;
- "boolean"——如果這個(gè)值是布爾值;
- "string"——如果這個(gè)值是字符串份企;
- "number"——如果這個(gè)值是數(shù)值也榄;
- "object"——如果這個(gè)值是對(duì)象或null;
- "function"——如果這個(gè)值是函數(shù)司志。
** 注意:typeof 是一個(gè)操作符而不是函數(shù)甜紫,因此圓括號(hào)不是必須的。 **
1.3.2 Undefined 類型
Undefined類型只有一個(gè)值骂远,即特殊的undefined
囚霸。在使用var聲明變量但未對(duì)其加以初始化時(shí),這個(gè)變量的值就是undefined
激才。
對(duì)于尚未聲明的變量邮辽,只能執(zhí)行一項(xiàng)操作,即使用typeof
操作符檢測(cè)器數(shù)據(jù)類型贸营。然而吨述,令人困惑的是:對(duì)未初始化的變量執(zhí)行typeof
操作符同樣也會(huì)返回undefined
值。
1.3.3 Null 類型
Null類型也是只有一個(gè)值钞脂,這個(gè)特殊的值是null
仇箱。從邏輯的角度講,null
值表示一個(gè)空對(duì)象指針望几,而這也是使用typeof
操作符檢測(cè)null
值會(huì)返回"object"的原因蛀缝。如果定義的變量準(zhǔn)備在將來用于保存對(duì)象,那么最好將該變量初始化為null
而不是其他值阎毅。
1.3.4 Boolean 類型
該類型只有兩個(gè)字面值:true
和false
焚刚。ECMAScript中所有類型的值都有與這兩個(gè)Boolean值等價(jià)的值。要將一個(gè)值轉(zhuǎn)換為其對(duì)應(yīng)的Boolean值扇调,可以調(diào)用轉(zhuǎn)型函數(shù)Boolean()矿咕。下表給出了各種數(shù)據(jù)類型及其對(duì)應(yīng)的轉(zhuǎn)換規(guī)則。
數(shù)據(jù)類型 | 轉(zhuǎn)換為true的值 | 轉(zhuǎn)換為false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非零數(shù)字值(包括無窮大) | 0和NAN |
Object | 任何對(duì)象 | null |
Undefined | n/a | undefined |
1.3.5 Number 類型
除了以十進(jìn)制表示外,整數(shù)還可以通過八進(jìn)制或十六進(jìn)制的字面值表示碳柱。其中捡絮,八進(jìn)制字面值的第一位必須是0,然后是八進(jìn)制數(shù)字序列(0~7)莲镣。如果字面值中的數(shù)值超過范圍福稳,前導(dǎo)零將被忽略,后面的數(shù)值將被當(dāng)作十進(jìn)制數(shù)值解析瑞侮。注意:八進(jìn)制字面量在嚴(yán)格模式下是無效的的圆。
十六進(jìn)制字面值的前兩位必須是0x,后跟任何十六進(jìn)制數(shù)字(0~9及A~F)半火。其中略板,字母A~F可以大寫,也可以小寫慈缔。
1. 浮點(diǎn)數(shù)值
所謂浮點(diǎn)數(shù)值叮称,就是該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字藐鹤。
由于保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍瓤檐,因此ECMAScript會(huì)適時(shí)地將浮點(diǎn)數(shù)值轉(zhuǎn)換為整數(shù)值。如果小數(shù)點(diǎn)后面沒有跟任何數(shù)字娱节,那么這個(gè)數(shù)值就可以作為整數(shù)值來保存挠蛉。同樣地,如果浮點(diǎn)數(shù)值本身就是一個(gè)整數(shù)(如1.0)肄满,那么該數(shù)值也會(huì)被轉(zhuǎn)換為整數(shù)谴古。
對(duì)于那些極大或極小的數(shù)值,可以用e表示法(即科學(xué)計(jì)數(shù)法)表示的浮點(diǎn)數(shù)表示稠歉。用e表示法表示的數(shù)值等于e前面的數(shù)值乘以10的指數(shù)次冪掰担。注意:由于浮點(diǎn)數(shù)值計(jì)算有精度誤差,因此永遠(yuǎn)不要測(cè)試某個(gè)特定的浮點(diǎn)數(shù)值怒炸。
2. 數(shù)值范圍
ECMAScript能夠表示的最小數(shù)值保存在Number.MIN_VALUE中带饱,能夠表示的最大數(shù)值保存在Number.MAX_VALUE中。如果某次計(jì)算的結(jié)果得到一個(gè)超出JavaScript數(shù)值范圍的值阅羹,那么這個(gè)數(shù)值將被自動(dòng)轉(zhuǎn)換成特殊的Infinity值勺疼。
3. NaN
NaN,即非數(shù)值(Not a Number)捏鱼。這個(gè)數(shù)值用于表示一個(gè)本來要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況执庐,例如,0除以0會(huì)返回NaN导梆。
NaN本身有兩個(gè)非同尋常的特點(diǎn):
- 任何涉及NaN的操作都會(huì)返回NaN
- NaN與任何值都不相等
針對(duì)這兩個(gè)特點(diǎn)轨淌,ECMAScript定義了isNaN()函數(shù)迂烁。該函數(shù)接收一個(gè)值之后,會(huì)嘗試將這個(gè)值轉(zhuǎn)換為數(shù)值猿诸,而任何不能被轉(zhuǎn)換為數(shù)值的值都會(huì)導(dǎo)致這個(gè)函數(shù)返回true婚被。請(qǐng)看下面例子:
alert(isNaN(NaN)); // true
alert(isNaN(10)); // false
alert(isNaN("10")); // false
alert(isNaN("0isfalse")); // true
alert(isNaN(true)); // false
4. 數(shù)值變換
有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()狡忙、parseInt()和parseFloat()梳虽。第一個(gè)函數(shù)可以用于任何數(shù)據(jù)類型,而另兩個(gè)函數(shù)則專門可用于把字符串轉(zhuǎn)換為數(shù)值灾茁。
Number()函數(shù)的轉(zhuǎn)換規(guī)則如下:
- 如果是Boolean值窜觉,true和false將被分別轉(zhuǎn)換為1和0。
- 如果是數(shù)字值北专,只是簡單的傳入和返回禀挫。
- 如果是null值,返回零拓颓。
- 如果是undefined语婴,返回NaN。
- 如果是字符串驶睦,遵循下列規(guī)則:
- 如果字符串中只包含數(shù)字(包含前面帶正號(hào)或負(fù)號(hào)的情況)砰左,則將其轉(zhuǎn)換為十進(jìn)制數(shù)值,即"1"會(huì)變成1场航,而"011"會(huì)變成11(注意:前導(dǎo)的零被忽略了)
- 如果字符串中包含有效的浮點(diǎn)格式缠导,如"1.1",則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值(同樣溉痢,也會(huì)忽略前導(dǎo)零)
- 如果字符串中包含有效的十六進(jìn)制格式僻造,例如"0xf",則將其轉(zhuǎn)換為相同大小的十進(jìn)制整數(shù)值
- 如果字符串是空的(不包含任何字符)孩饼,則將其轉(zhuǎn)換為0
- 如果字符串中包含除上述格式之外的字符髓削,則將其轉(zhuǎn)換為NaN
- 如果是對(duì)象,則調(diào)用valueOf()方法镀娶,然后依照前面的規(guī)則轉(zhuǎn)換返回的值蔬螟。如果轉(zhuǎn)換的結(jié)果是NaN,則調(diào)用對(duì)象的toString()方法汽畴,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值旧巾。
parseInt()函數(shù)的轉(zhuǎn)換規(guī)則如下:
該函數(shù)會(huì)忽略字符串前面的空格,直至找到第一個(gè)非空格字符忍些。如果第一個(gè)字符不是數(shù)字字符或者正負(fù)號(hào)鲁猩,parseInt()就會(huì)返回NaN。如果第一個(gè)字符是數(shù)字字符罢坝,parseInt()會(huì)繼續(xù)解析第二個(gè)字符廓握,直到解析完所有后續(xù)字符或者遇到了一個(gè)非數(shù)字字符搅窿。
如果字符串以"0x"開頭且后跟數(shù)字字符,就會(huì)將其當(dāng)作一個(gè)十六進(jìn)制整數(shù)隙券。但是在ECMAScript 5 JavaScript引擎中男应,parseInt()已經(jīng)不具有解析八進(jìn)制值的能力,因此前導(dǎo)的零會(huì)被認(rèn)為無效娱仔。
為了消除在使用parseInt()函數(shù)可能導(dǎo)致的疑惑沐飘,可以為這個(gè)函數(shù)提供第二個(gè)參數(shù):轉(zhuǎn)換時(shí)使用的基數(shù)。** 注意:為了避免錯(cuò)誤的解析牲迫,建議無論在什么情況下都明確指定基數(shù)耐朴。**
parseFloat()函數(shù)的轉(zhuǎn)換規(guī)則如下:
parseFloat()函數(shù)也是從第一個(gè)字符開始解析直至遇到第一個(gè)無效的浮點(diǎn)數(shù)字字符為止。也就是說盹憎,字符串中的第一個(gè)小數(shù)點(diǎn)是有效的筛峭,而第二個(gè)小數(shù)點(diǎn)就是無效的了。parseFloat()函數(shù)始終都會(huì)忽略前導(dǎo)的零陪每。同時(shí)影晓,該函數(shù)只解析十進(jìn)制值,因此它沒有用第二個(gè)參數(shù)指定基數(shù)的用法檩禾。最后還要注意的是挂签,如果字符串包含的是一個(gè)可解析為整數(shù)的數(shù),那么將會(huì)返回整數(shù)锌订。
1.3.6 String類型
String類型用于表示由零或多個(gè)16位Unicode字符組成的字符序列竹握,即字符串。
字符串可以由雙引號(hào)(")或單引號(hào)(')表示辆飘。
1. 字符字面量
String數(shù)據(jù)類型包含一些特殊的字符字面量啦辐,也叫轉(zhuǎn)義序列。
字面量 | 含義 |
---|---|
\n | 換行 |
\t | 制表 |
\b | 退格 |
\r | 回車 |
\f | 進(jìn)紙 |
\\ | 斜杠 |
' | 單引號(hào) |
" | 雙引號(hào) |
\xnn | 以十六進(jìn)制代碼nn表示的一個(gè)字符 |
\unnnn | 以十六進(jìn)制代碼nnnn表示的一個(gè)Unicode 字符 |
這些字符字面量可以出現(xiàn)在字符串中的任意位置蜈项,而且也將被作為一個(gè)字符來解釋芹关。任何字符串的長度都可以通過訪問其length屬性取得。
2. 字符串的特點(diǎn)
ECMAScript中的字符串是不可變的紧卒,也就是說侥衬,字符一旦創(chuàng)建,它們的值就不能改變跑芳。要改變某個(gè)變量保存的字符串轴总,首先要銷毀原來的字符串,然后再用另一個(gè)包含新值的字符串填充該變量博个,例如:
var lang = "Java";
lang = lang + "Script";
以上示例中的變量lang開始時(shí)包含字符串"Java"怀樟。而第二行代碼把lang的值重新定義為"Java"與"Script"的結(jié)合,即"JavaScript"盆佣。實(shí)現(xiàn)這個(gè)操作的過程如下:首先創(chuàng)建一個(gè)能容納10個(gè)字符的字符串往堡,然后在這個(gè)字符串中填充"Java"和"Script"械荷,最后一步是銷毀原來的字符串"Java"和字符串"Script",這個(gè)過程是在后臺(tái)發(fā)生的虑灰。
3.轉(zhuǎn)換為字符串
要把一個(gè)值轉(zhuǎn)換為一個(gè)字符串有兩種方式吨瞎。第一種是使用幾乎每個(gè)值都有的toString()方法。數(shù)值穆咐、布爾值颤诀、對(duì)象和字符串值(每個(gè)字符串值也都有一個(gè)toString()方法。但null和undefined值沒有這個(gè)方法庸娱。)
在調(diào)用數(shù)值的toString()方法時(shí)着绊,可以傳遞一個(gè)參數(shù):輸出數(shù)值的基數(shù)谐算。默認(rèn)情況下熟尉,toString()方法以十進(jìn)制格式返回?cái)?shù)值的字符串表示。而通過傳遞參數(shù)洲脂,toString()可以輸出任意有效進(jìn)制格式表示的字符串值斤儿。
在不知道要轉(zhuǎn)換的值是不是null或undefined的情況下,還可以使用轉(zhuǎn)型函數(shù)String()恐锦,這個(gè)函數(shù)能夠?qū)⑷魏晤愋偷闹缔D(zhuǎn)換為字符串往果。String()函數(shù)遵循下列轉(zhuǎn)換規(guī)則:
- 如果值有toString()方法,則調(diào)用該方法(沒有參數(shù))并返回相應(yīng)的結(jié)果
- 如果值是null一铅,則返回"null"
- 如果值是undefined陕贮,則返回"undefined"
** 要把某個(gè)值轉(zhuǎn)換為字符串,可以使用加號(hào)操作符把它與一個(gè)字符串("")加在一起潘飘。**
3.4.7 Object類型
ECMAScript中的對(duì)象其實(shí)就是一組數(shù)據(jù)和功能的集合肮之。對(duì)象可以通過執(zhí)行new操作符后跟要?jiǎng)?chuàng)建的對(duì)象類型的名稱來創(chuàng)建。而創(chuàng)建Object類型的實(shí)例并為其添加屬性和(或)方法卜录,就可以創(chuàng)建自定義對(duì)象戈擒,如下圖所示:
var o = new Object();
在ECMAScript中,有一個(gè)重要的思想必須理解:**Object類型是所有它的實(shí)例的基礎(chǔ)艰毒。換句話說筐高,Object類型所具有的任何屬性和方法也同樣存在于更具體的對(duì)象中。
Object的每個(gè)實(shí)例都具有下列屬性和方法:
- constructor:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)丑瞧。對(duì)于前面的例子而言柑土,構(gòu)造函數(shù)(constructor)就是Object()。
- hasOwnProperty(propertyName):用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中(而不是在實(shí)例的原型中)是否存在绊汹。
- isPrototypeOf(object):用于檢查傳入的對(duì)象是否是傳入對(duì)象的原型稽屏。
- propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用for-in語句來枚舉。
- toLocaleString():返回對(duì)象的字符串表示灸促,該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)诫欠。
- toString():返回對(duì)象的字符串表示涵卵。
- valueOf():返回對(duì)象的字符串、數(shù)值或布爾值表示荒叼。通常與toString()方法的返回值相同轿偎。