語法
區(qū)分大小寫
ECMAScript中的一切都區(qū)分大小寫平绩。
標識符
標識符指變量、函數(shù)邻吭、屬性、參數(shù)的名字宴霸,有如下規(guī)則:
- 第一個字符必須是字母囱晴、下劃線或$
- 其他字符可以是字母、下劃線猖败、$ 或數(shù)字
- 不能把關(guān)鍵字速缆、保留字、
true
恩闻、false
艺糜、null
用作標識符
標識符中的字符可以是擴展的ASCII或Unicode字符,但不推薦
按照慣例幢尚,標識符采用駝峰大小寫格式
注釋
兩個斜杠//
開頭表示行級注釋
以/*
開頭破停,以*/
結(jié)尾的表示塊級注釋
嚴格模式
在腳本頂部或函數(shù)內(nèi)第一行添加如下代碼開啟嚴格模式:
"use strict;"
語句
ECMAScript語句以分號結(jié)尾,可以省略尉剩,但不推薦真慢,添加分號不僅可以降低壓縮代碼時出錯的概率,也可以提升性能(解析器不用花時間判斷哪里需要分號)
關(guān)鍵字和保留字
保留字在ECMAScript中沒有任何特定用途理茎,但將來可能被用作關(guān)鍵字黑界。
以下是ECMAScript全部的關(guān)鍵字,標注星號的是ECMAScript 5提出來的:
以下是全部保留字:
變量
ECMAScript中的變量是松散型的皂林,可以保存任何類型的數(shù)據(jù)朗鸠。
var name;
在當前作用域中定義了一個名為name
的局部變量,也可以在定義時順便賦值var name = 'Sue';
础倍,但這樣并不會給name
標注成字符串類型的變量烛占。
如果我們給一個未定義的變量賦值,非嚴格模式下,我們會創(chuàng)建一個全局變量忆家,嚴格模式下犹菇,會拋出ReferenceError
。
可以使用一條語句定義多個變量:
var name = 'Sue',
age = '24';
數(shù)據(jù)類型
ECMAScript中有5中基本數(shù)據(jù)類型:Number Boolean String Null Undefined芽卿,一種復雜數(shù)據(jù)類型:Object揭芍,所有值都是這6種類型之一。
typeof
由于ECMAScript變量是松散的卸例,因此需要一種手段來告訴我們變量存儲的值的類型沼沈,于是就有了typeof,typeof操作符可以返回如下結(jié)果:
-
"undefined"
:值未定義 -
"boolean"
:布爾值 -
"string"
:字符串 -
"object"
:對象或null
-
"number"
:數(shù)值 -
"function"
:函數(shù)
typeof
操作符的操作數(shù)可以是變量也可以是數(shù)值字面量币厕。
有幾個地方可能會讓人迷惑:
-
typeof null
時返回"object"
列另,這是因為null
被認為是空對象的引用 - Safari5及之前版本、Chrome7及之前版本旦装,
typeof /^d$/
返回"function"
页衙,其他瀏覽器返回"object"
-
function
屬于object
卻被區(qū)別對待,這是因為function
比較特殊阴绢,有必要去識別它
Undefined
類型
Undefined
類型只有一個值undefined
店乐,聲明時未被賦值的變量會為其賦予undefined
,最初設(shè)計這個類型是為了區(qū)分空指針和未初始化變量呻袭,因此不存在需要為一個變量顯式地賦予undefined
值的情況眨八。
對未初始化和未聲明的變量調(diào)用typeof
都會返回undefined
,這是由于這兩種都不可能執(zhí)行真正的操作左电,但為了使typeof
能夠反應一個變量是否被聲明廉侧,我們最好在定義一個變量時為它賦值。
Null
類型
Null
類型只有一個值null
篓足,它是一個空指針對象段誊,undefined
派生自null
,因此:
undefined == null; //true
前面提到過栈拖,不存在需要為一個變量顯式地賦值undefined
的情況连舍,但我們?nèi)绻暶髁艘粋€將來要保存對象類型的變量,我們最好在這個變量被定義時給它賦予null
涩哟,
Boolean
類型
Boolean
類型只有兩個值true
false
索赏,可以對任何數(shù)據(jù)類型調(diào)用Boolean()
,返回結(jié)果是true
or false
數(shù)據(jù)類型 | 轉(zhuǎn)化為true 的值 |
轉(zhuǎn)化為false 的值 |
---|---|---|
Boolean | true |
false |
String | 任何非空字符串 | 空字符串""
|
Number | 任何非0數(shù)值 | 0和NaN
|
Object | 任何非空對象 | 空對象null
|
Undefined | N/A | undefined |
Number類型
Number類型使用IEEE754表示整數(shù)和浮點數(shù)
整數(shù)
- 十進制整數(shù)
var num = 55;
- 八進制整數(shù)贴彼,第一位必須是0潜腻,然后是0~7,如果超出范圍锻弓,前導0會被忽略砾赔,后面的數(shù)值當做十進制整數(shù)解析蝌箍。嚴格模式下八進制無效青灼,會拋出錯誤暴心。
var num1 = 070; // 7*8 + 0 = 56
var num2 = 079: // 79
- 十六進制整數(shù),前兩位是0x杂拨,后面跟0 ~ 9和A~F(or a~f)专普,如果超出范圍,會拋出錯誤弹沽。
var num = 0x15a; //1*16*16 + 5*16 + 10 = 346
在進行算術(shù)計算時檀夹,八進制和十六進制都會轉(zhuǎn)化為十進制:
var num1 = 10;
var num2 = 071;
var num3 = 0x56A;
num1 + num2; //67
num2 + num2; //114
num2 + num3; // 1553
num3 + num3; //2772
浮點數(shù)
浮點數(shù)值即數(shù)值中包含小數(shù)點,且小數(shù)點后必須有至少以為數(shù)字策橘,注意小數(shù)點前可以沒有數(shù)字炸渡,但不推薦。
由于保存浮點數(shù)需要的空間是整數(shù)的兩倍丽已,因此如果可以蚌堵,ECMAScript會將浮點數(shù)保存為整數(shù),比如:
var num1 = 1.0; // 1
var num2 = 1.; // 1
對于極大或極小的數(shù)值沛婴,可以用科學技術(shù)法表示(e或E):
var num = 2.34e6; //2.34 * Math.pow(10, 6)
在進行算術(shù)運算時吼畏,浮點數(shù)的精度遠遠不如整數(shù),會有舍入誤差嘁灯,比如:
0.1 + 0.2 // 0.30000000000000004
所以永遠不要測定某個浮點數(shù)值
數(shù)值范圍
由于內(nèi)存的限制泻蚊,ECMAScript 并不能保存世界上所有的數(shù)值。ECMAScript 能夠表示的最小數(shù)值保存在Number.MIN_VALUE 中——在大多數(shù)瀏覽器中丑婿,這個值是5e-324性雄;能夠表示的最大數(shù)值保存在Number.MAX_VALUE 中——在大多數(shù)瀏覽器中,這個值1.7976931348623157e+308羹奉。如果某次計算的結(jié)果得到了一個超出JavaScript 數(shù)值范圍的值毅贮,那么這個數(shù)值將被自動轉(zhuǎn)換成特殊的Infinity 值。具體來說尘奏,如果這個數(shù)值是負數(shù)滩褥,則會被轉(zhuǎn)換成-Infinity(負無窮),如果這個數(shù)值是正數(shù)炫加,則會被轉(zhuǎn)換成Infinity(正無窮)瑰煎。
以上引用了原文中的一段話,筆者親自試驗發(fā)現(xiàn)不是這樣俗孝,在chrome 63.0.3239.132和Microsoft Edge中打開調(diào)試工具酒甸,做了如下運算:
Number.MAX_VALUE + 1; // 1.7976931348623157e+308
Number.MAX_VALUE + Math.pow(10, 291); // 1.7976931348623157e+308
Number.MAX_VALUE + Math.pow(10, 292); // Infinity
關(guān)于Number.MIN_VALUE
說的也不是很準確,準確來說赋铝,這個變量保存了最小的大于零的數(shù)值
NaN
NaN
插勤, Not a Number,用于表示非數(shù)值。
- 0 / 0 =
NaN
- 任何涉及
NaN
的運算都會返回NaN
-
NaN
與任何數(shù)值包括NaN
都不相等
可以通過isNaN()
來判斷任何數(shù)據(jù)類型是否是非數(shù)值农尖,isNaN()
在接收到一個參數(shù)后析恋,如果它是基本數(shù)據(jù)類型,會嘗試將其轉(zhuǎn)化為數(shù)值盛卡,如果它是object
助隧,會先調(diào)用它的valueof()
,再確定返回值是否能轉(zhuǎn)化成數(shù)值滑沧,如果不能并村,則基于返回值調(diào)用toString()
,然后再嘗試轉(zhuǎn)化成數(shù)值滓技。
isNaN(NaN); // true
isNaN(10); // false
isNaN("10"); // false
isNaN("blue"); // true
isNaN(true); // false
isNaN([1, 2]); // true, [1, 2].valueof()返回[1, 2], [1, 2].toString() 返回 "1, 2"
isNaN([1]): // false, [1].valueof()返回[1], [1].toString() 返回 "1"
數(shù)值轉(zhuǎn)換
Number()
數(shù)據(jù)類型 | 值 |
---|---|
Boolean |
true 為1哩牍, false 為0 |
Number | 輸入即輸出 |
Null | 0 |
Undefined | 0 |
可以用于任何數(shù)據(jù)類型, 規(guī)則如下:
數(shù)據(jù)類型 | 值 |
---|---|
Boolean |
true 為1令漂, false 為0 |
Number | 輸入即輸出 |
Null | 0 |
Undefined | 0 |
String
類型比較負責姐叁,規(guī)則如下:
- 如果只包含數(shù)字,包括前面帶正負號的情況洗显,將其轉(zhuǎn)化為數(shù)字(前導0被忽略)
- 如果包含有效的十六進制格式外潜,將其轉(zhuǎn)化為十進制
- 如果包含有效的浮點格式,將其轉(zhuǎn)化為浮點數(shù)值
- 空字符串轉(zhuǎn)化為0
- 如果以上情況均不滿足挠唆,轉(zhuǎn)化為
NaN
舉一些例子:
Number(true); // 1
Number(false); //0
Number(null); // 0
Number(undefined); //0
Number(3); // 3
Number(""); //0
Number("05"); // 5 不會把它當做八進制
Number("5.21"); //5.21
Number("0x43A"); // 1082
Number("num"); // NaN
parseInt()
parseInt()
接收字符串參數(shù)处窥,有如下規(guī)則:
- 會忽略字符串前面的空格,直至找到第一個非空格字符玄组,如果第一個非空格字符不是數(shù)字或正負號滔驾,那么返回
NaN
- 如果第一個非空格字符是數(shù)字,那么繼續(xù)解析下一個字符俄讹,直至遇到不是數(shù)字的字符或者解析完后續(xù)所有字符哆致,注意小數(shù)點并不是有效的數(shù)字字符
- 可以識別十進制,八進制患膛,十六進制摊阀,ECMAScript 5中,需要為其傳入第二個參數(shù)指明進制踪蹬,才可以識別八進制胞此。在指明進制的情況下八進制可以不帶前導0,十六進制可以不帶0x跃捣。
舉一些例子:
parseInt(""); //NaN
parseInt(".23); //NaN
parseInt("23.4"); //23
parseInt("23abc"); //23
parseInt("+23"); //23
parseInt("-23"); //-23
parseInt("070"); //70, ECMAScript
parseInt("0x7A"); //122
parseInt("070", 8); //56
parseInt("7A", 16); //122
parseFloat()
parseFloat() 與 parseInt() 很類似漱牵,有兩點區(qū)別:
- parseFloat() 字符串第一個小數(shù)點是有效的,第二個是無效的疚漆,后面的也不會解析
- parseFloat() 不能識別八進制和十六進制酣胀,符合八進制的字符串會忽略前導0刁赦,符合十六進制的字符串會被解析為0
- parseFloat() 可以識別科學計數(shù)法
舉一些例子:
parseFloat("23.24.5"); //23.24
parseFloat("3.4e5"); //340000
parseFloat("0x8A"); //0
parseFloat("045"); //45
String類型
有0或多個16位Unicode字符字符組成的字符序列,即字符串闻镶,可由單引號或雙引號表示甚脉。
轉(zhuǎn)義序列
表示非打印或有其他用途的字符
轉(zhuǎn)義序列 | 含義 |
---|---|
\n | 換行 |
\t | 制表 |
\b | 空格 |
\r | 回車 |
\f | 進紙 |
\ | 斜杠 |
' | 用于在單引號表示的字符串中顯示單引號 |
" | 用于在雙引號表示的字符串中顯示雙引號 |
\xnn | 以十六進制代碼nn表示的一個字符(其中n為0~F)。例如儒溉,\x41表示"A" |
\unnnn | 以十六進制代碼nnnn表示的一個Unicode字符(其中n為0~F)。例如发钝,\u03a3表示希臘字符Σ |
轉(zhuǎn)義序列可以出現(xiàn)在字符串的任何地方顿涣,作為一個字符來解析,可以通過length
屬性獲得字符串的長度
字符串的特點
var lang = "Java";
lang = lang + "Script";
以上示例中的變量lang 開始時包含字符串"Java"酝豪。而第二行代碼把lang 的值重新定義為"Java"與"Script"的組合涛碑,即"JavaScript"。實現(xiàn)這個操作的過程如下:首先創(chuàng)建一個能容納10 個字符的新字符串孵淘,然后在這個字符串中填充"Java"和"Script"蒲障,最后一步是銷毀原來的字符串"Java"和字符串"Script",因為這兩個字符串已經(jīng)沒用了瘫证。
轉(zhuǎn)化為字符串
-
toString()
Number揉阎、Boolean、Object背捌、String都有toString()
方法毙籽,Number的toString()
可以接收 進制參數(shù),以相應的進制格式輸出毡庆。 - 由于
null
和undefined
沒有toString()
方法坑赡,因此對null
orundefined
調(diào)用toString()
會報錯,我們可以使用轉(zhuǎn)型函數(shù)String()
么抗,它遵循以下規(guī)則:
- 如果帶
toString()
毅否,則調(diào)用toString()
- 如果是
null
, 則返回"null" - 如果是
undefined
蝇刀,則返回"undefined"
Object類型
對象就是一組數(shù)據(jù)和功能的集合螟加,可以通過new
后跟要創(chuàng)建的對象類型來創(chuàng)建,比如:
var array = new Array(10);
如果沒有參數(shù)吞琐,可省略括號仰迁。
Object
是所有它的實例的基礎(chǔ),每個實例都有如下屬性和方法:
- constructor顽分,是用于創(chuàng)建對象的函數(shù)徐许,對于上述例子,是
Array
函數(shù)
- hasOwnProperty(propertyName) 給定的屬性在當前實例而非原型中是否存在卒蘸,作為參數(shù)的屬性名必須是字符串
- isPrototypeOf(object) 檢查object是否是實例對象的原型
- propertyIsEnumerable(propertyName) 給定的屬性是否可以使用
for-in
來枚舉雌隅,作為參數(shù)的屬性名必須是字符串 - toLocaleString() 返回對象與執(zhí)行環(huán)境相對應的字符串表示
- toString() 返回對象的字符串表示
- valueOf() 返回對象的字符串翻默、布爾值、數(shù)值表示
ECMAScript中對象的行為不適用于DOM恰起、BOM中的對象修械。