1、什麼是JavaScript
1-一、JavaScript實現
雖然JavaScript和ECMAScript基本上是同義詞,但JavaScript遠不限於ECMA-262所定義的那樣。完整的JavaScript實現包含:前端
- 核心(ECMAScript)
- 文檔對象模型(DOM)
- 瀏覽器對象模型(BOM)
Web瀏覽器只是ECMAScript實現可能存在的一種宿主環境(hostenvironment)。宿主環境提供ECMAScript的基準實現和與環境自身交互必需的擴展。擴展(好比DOM)使用ECMAScript核心類型和語法,提供特定於環境的額外功能。其餘宿主環境還有服務器端JavaScript平臺Node.js和即將被淘汰的Adobe Flash。
在基本層面,描述這門語言:語法,類型,語句,關鍵字,保留字,操做符,全局對象
java
ECMAScript只是對實現這個規範描述的全部方面的一門語言的稱
呼。JavaScript實現了ECMAScript,而Adobe ActionScript一樣也實現了
ECMAScript。
node
1-二、DOM
文檔對象模型(DOM,Document Object Model)是一個應用編程接口(API),用於在HTML中使用擴展的XML。DOM將整個頁面抽象爲一組分層節點。HTML或XML頁面的每一個組成部分都是一種節
點,包含不一樣的數據。
正則表達式
DOM經過建立表示文檔的樹,讓開發者能夠爲所欲爲地控制網頁的內容和結構。使用DOM API,能夠輕鬆地刪除、添加、替換、修改節點。算法
1-三、BOM
IE3和Netscape Navigator 3提供了瀏覽器對象模型(BOM) API,用於支持訪問和操做瀏覽器的窗口。使用BOM,開發者能夠操控瀏覽器顯示頁面以外的部分。而BOM真正獨一無二的地方,固然也是問題最多的地方,就是它是惟一一個沒有相關標準的JavaScript實現。HTML5改變了這個局面,這個版本的HTML以正式規範的形式涵蓋了儘量多的BOM特性。因爲HTML5的出現,以前不少與BOM有關的問題都迎刃而解了。express
整體來講,BOM主要針對瀏覽器窗口和子窗口(frame),不過
人們一般會把任何特定於瀏覽器的擴展都歸在BOM的範疇內。下面就是這樣一些擴展:
編程
- 彈出新瀏覽器窗口的能力;
- 移動、縮放和關閉瀏覽器窗口的能力;
- navigator 對象,提供關於瀏覽器的詳盡信息;
- location 對象,提供瀏覽器加載頁面的詳盡信息;
- screen 對象,提供關於用戶屏幕分辨率的詳盡信息;
- performance 對象,提供瀏覽器內存佔用、導航行爲和時間統
- 計的詳盡信息;
- 對cookie的支持;
- 其餘自定義對象,如 XMLHttpRequest 和IE的
- ActiveXObject
2、HTML中的JavaScript
2-一、script
元素
將JavaScript插入HTML的主要方法是使用 script 元素。這
個元素是由網景公司創造出來,並最先在Netscape Navigator 2中實現
的。後來,這個元素被正式加入到HTML規範。 script 元素有下
列8個屬性。
數組
-
async
:可選。表示應該當即開始下載腳本,但不能阻止其餘頁面動做,好比下載資源或等待其餘腳本加載。只對外部腳本文件有效。瀏覽器 -
charset :可選。使用 src 屬性指定的代碼字符集。這個屬性不多使用,由於大多數瀏覽器不在意它的值。安全
-
crossorigin :可選。配置相關請求的CORS(跨源資源共享)設置。默認不使用CORS。crossorigin=「anonymous」 配置文件請求沒必要設置憑據標誌。 crossorigin=「use-credentials」 設置憑據標誌,意
味着出站請求會包含憑據。 -
defer :可選。表示在文檔解析和顯示完成後再執行腳本是沒有問題的。只對外部腳本文件有效。在IE7及更早的版本中,對行內腳本也能夠指定這個屬性。
-
integrity :可選。容許比對接收到的資源和指定的加密簽名以驗證子資源完整性(SRI,Subresource Intergrity)。若是接收到的資源的簽名與這個屬性指定的簽名不匹配,則頁面會報錯,腳本不會執行。這個屬性能夠用於確保內容分發網絡(CDN,Content Delivery Network)不會提供惡意內容。
-
language :廢棄。最初用於表示代碼塊中的腳本語言(如 「JavaScript」 、 「JavaScript1.2」 或 「VBScript」 )。大多數瀏覽器都會忽略這個屬性,不該該再使用它。
-
src :可選。表示包含要執行的代碼的外部文件。
-
type :可選。代替 language ,表示代碼塊中腳本語言的內容類型(也稱MIME類型)。
包含在 script 內的代碼會被從上到下解釋
2-二、
使用了 src 屬性的 script 元素不該該再在 script 和 /script 標籤中再包含其餘JavaScript代碼。若是二者都提供的話,則瀏覽器只會下載並執行腳本文件,從而忽略行內代碼。
script 元素的一個最爲強大、同時也備受爭議的特性是,它能夠包含來自外部域的JavaScript文件。跟 img 元素很像, script 元素的 src 屬性能夠是一個完整的URL,並且這個URL指向的資源能夠跟包含它的HTML頁面不在同一個域中
2-三、文檔模式
可使用 doctype 切換文檔模式。最初的文檔模式有兩種:混雜模式(quirks mode)和標準模式(standards mode)。前者讓IE像IE5同樣(支持一些非標準的特性),後者讓IE具備兼容標準的行爲。雖然這兩種模式的主要區別只體如今經過CSS渲染的內容方面,但對JavaScript也有一些關聯影響,或稱爲反作用。本書會常常提到這些反作用。
IE初次支持文檔模式切換之後,其餘瀏覽器也跟着實現了。隨着瀏覽器的廣泛實現,又出現了第三種文檔模式:準標準模式(almost
standards mode)。這種模式下的瀏覽器支持不少標準的特性,可是沒有標準規定得那麼嚴格。主要區別在於如何對待圖片元素周圍的空白(在表格中使用圖片時最明顯)。
混雜模式在全部瀏覽器中都以省略文檔開頭的 doctype 聲明做爲開關。這種約定並不合理,由於混雜模式在不一樣瀏覽器中的差別很是大,不使用黑科技基本上就沒有瀏覽器一致性可言。
2-四、noscript 元素
針對早期瀏覽器不支持JavaScript的問題,須要一個頁面優雅降級的處理方案。最終, 元素出現,被用於給不支持JavaScript的瀏覽器提供替代內容。雖然現在的瀏覽器已經100%支持JavaScript,但對於禁用JavaScript的瀏覽器來講,這個元素仍然有它的用處。
元素能夠包含任何能夠出如今 中的HTML元素,
- 瀏覽器不支持腳本
- 瀏覽器對腳本的支持被關閉
3、語法基礎
3-一、語法
首先要知道的是,ECMAScript中一切都區分大小寫。不管是變量、函數名仍是操做符,都區分大小寫。換句話說,變量 test 和變量 Test 是兩個不一樣的變量。相似地, typeof 不能做爲函數名,由於它是一個關鍵字(後面會介紹)。但 Typeof 是一個徹底有效的函數名。
3-二、標識符
所謂標識符,就是變量、函數、屬性或函數參數的名稱。標識符能夠由一或多個下列字符組成:
- 第一個字符必須是一個字母、下劃線( _ )或美圓符號( $ );
- 剩下的其餘字符能夠是字母、下劃線、美圓符號或數字。
標識符中的字母能夠是擴展ASCII(Extended ASCII)中的字母,也能夠是Unicode的字母字符,如À和Æ(但不推薦使用)。
按照慣例,ECMAScript標識符使用駝峯大小寫形式,即第一個單詞的首字母小寫,後面每一個單詞的首字母大寫
3-三、嚴格模式
ECMAScript 5增長了嚴格模式(strict mode)的概念。嚴格模式是一種不一樣的JavaScript解析和執行模型,ECMAScript 3的一些不規範寫法在這種模式下會被處理,對於不安全的活動將拋出錯誤
3-四、關鍵字與保留字
ECMA-262描述了一組保留的關鍵字,這些關鍵字有特殊用途,好比表示控制語句的開始和結束,或者執行特定的操做
ECMA-262第6版規定的全部關鍵字:
break do in typeof case else instanceof var catch export new void class extends return while const finally super with continue for switch yield debugger function this default if throw delete import try
規範中也描述了一組將來的保留字,一樣不能用做標識符或屬性名。雖然保留字在語言中沒有特定用途,但它們是保留給未來作關鍵字用的
3-五、變量
ECMAScript變量是鬆散類型的,意思是變量能夠用於保存任何類型的數據。每一個變量只不過是一個用於保存任意值的命名佔位符。有3個關鍵字能夠聲明變量: var 、 const 和 let 。其中, var 在CMAScript的全部版本中均可以使用,而 const 和 let 只能在ECMAScript 6及更晚的版本中使用
3-六、var關鍵字
-
var聲明做用域
關鍵的問題在於,使用 var 操做符定義的變量會成爲包含它的函數的局部變量。好比,使用 var 在一個函數內部定義一個變量,就意味着該變量將在函數退出時被銷燬 -
var 聲明提高
使用 var 時,下面的代碼不會報錯。這是由於使用這個關鍵字聲明的變量會自動提高到函數做用域頂部
3-七、let 聲明
let 跟 var 的做用差很少,但有着很是重要的區別。最明顯的區別是, let 聲明的範圍是塊做用域,而 var 聲明的範圍是函數做用域。
-
暫時性死區
let 與 var 的另外一個重要的區別,就是 let 聲明的變量不會在做用域中被提高。 -
全局聲明
與 var 關鍵字不一樣,使用 let 在全局做用域中聲明的變量不會成爲 window 對象的屬性( var 聲明的變量則會) -
條件聲明
在使用 var 聲明變量時,因爲聲明會被提高,JavaScript引擎會自動將多餘的聲明在做用域頂部合併爲一個聲明。由於 let 的做用域是塊,因此不可能檢查前面是否已經使用 let 聲明過同名變量,同時也就不可能在沒有聲明的狀況下聲明它 -
for 循環中的 let 聲明
在 let 出現以前, for 循環定義的迭代變量會滲透到循環體外部 -
const 聲明
const 的行爲與 let 基本相同,惟一一個重要的區別是用它聲明變量時必須同時初始化變量,且嘗試修改 const 聲明的變量會致使運行時錯誤。
3-八、聲明風格及最佳實踐
ECMAScript 6增長 let 和 const 從客觀上爲這門語言更精確地聲明做用域和語義提供了更好的支持。行爲怪異的 var 所形成的各類問題,已經讓JavaScript社區爲之苦惱了不少年。隨着這兩個新關鍵字的出現,新的有助於提高代碼質量的最佳實踐也逐漸顯現。
- 不使用 var
有了 let 和 const ,大多數開發者會發現本身再也不須要 var了。限制本身只使用 let 和 const 有助於提高代碼質量,由於變量有了明確的做用域、聲明位置,以及不變的值。 - const 優先, let 次之
使用 const 聲明可讓瀏覽器運行時強制保持變量不變,也可讓靜態代碼分析工具提早發現不合法的賦值操做。所以,不少開發者認爲應該優先使用 const 來聲明變量,只在提早知道將來會有修改時,再使用 let 。這樣可讓開發者更有信心地推斷某些變量的值永遠不會變,同時也能迅速發現因意外賦值致使的非預期行爲。
4、數據類型
ECMAScript有6種簡單數據類型(也稱爲原始類型):Undefined 、 Null 、 Boolean 、 Number 、 String 和Symbol 。 Symbol (符號)是ECMAScript 6新增的。還有一種複雜數據類型叫 Object (對象)。 Object 是一種無序名值對的集合。由於在ECMAScript中不能定義本身的數據類型,全部值均可以用上述7種數據類型之一來表示。只有7種數據類型彷佛不足以表示所有數據。但ECMAScript的數據類型很靈活,一種數據類型能夠看成多種數據類型來使用
4-一、typeof 操做符
由於ECMAScript的類型系統是鬆散的,因此須要一種手段來肯定任意變量的數據類型。 typeof 操做符就是爲此而生的。對一個值使用 typeof 操做符會返回下列字符串之一:
「undefined」 表示值未定義;
「boolean」 表示值爲布爾值;
「string」 表示值爲字符串;
「number」 表示值爲數值;
「object」 表示值爲對象(而不是函數)或 null ;
「function」 表示值爲函數;
「symbol」 表示值爲符號。
4-二、Undefined 類型
Undefined 類型只有一個值,就是特殊值 undefined 。當使用 var 或 let 聲明瞭變量但沒有初始化時,就至關於給變量賦予了 undefined 值
即便未初始化的變量會被自動賦予 undefined 值,但咱們仍然建議在聲明變量的同時進行初始化。這樣,當 typeof 返回 「undefined」 時,你就會知道那是由於給定的變量還沒有聲明,而不是聲明瞭但未初始化。
4-三、Null 類型
Null 類型一樣只有一個值,即特殊值 null 。邏輯上講,null 值表示一個空對象指針,這也是給 typeof 傳一個 null 會返回 「object」 的緣由
在定義未來要保存對象值的變量時,建議使用 null 來初始化,不要使用其餘值。這樣,只要檢查這個變量的值是否是 null 就能夠知道這個變量是否在後來被從新賦予了一個對象的引用
用等於操做符( == )比較 null 和 undefined 始終返回true 。但要注意,這個操做符會爲了比較而轉換它的操做數。
即便 null 和 undefined 有關係,它們的用途也是徹底不同的。如前所述,永遠沒必要顯式地將變量值設置爲 undefined 。但null 不是這樣的。任什麼時候候,只要變量要保存對象,而當時又沒有那個對象可保存,就要用 null 來填充該變量。這樣就能夠保持null 是空對象指針的語義,並進一步將其與 undefined 區分開來。
null 是一個假值。所以,若是須要,能夠用更簡潔的方式檢測它。不過要記住,也有不少其餘可能的值一樣是假值。因此必定要明確本身想檢測的就是 null 這個字面值,而不只僅是假值
4-四、Boolean 類型
Boolean (布爾值)類型是ECMAScript中使用最頻繁的類型之一,有兩個字面值: true 和 false 。這兩個布爾值不一樣於數值,所以 true 不等於1, false 不等於0
注意:布爾值字面量 true 和 false 是區分大小寫的,所以True 和 False (及其餘大小混寫形式)是有效的標識符,但不是布爾值。
4-五、Number 類型
ECMAScript中最有意思的數據類型或許就是 Number 了。Number 類型使用IEEE 754格式表示整數和浮點值(在某些語言中也叫雙精度值)。不一樣的數值類型相應地也有不一樣的數值字面量格式
-
浮點值
要定義浮點值,數值中必須包含小數點,並且小數點後面必須至
少有一個數字。雖然小數點前面不是必須有整數,但推薦加上。 -
值的範圍
因爲內存的限制,ECMAScript並不支持表示這個世界上的全部數值。ECMAScript能夠表示的最小數值保存在Number.MIN_VALUE 中,這個值在多數瀏覽器中是5e-324;能夠表示的最大數值保存在 Number.MAX_VALUE 中,這個值在多數瀏覽器中是1.797 693 134 862 315 7e+308。若是某個計算獲得的數值結果超出了JavaScript能夠表示的範圍,那麼這個數值會被自動轉換爲一個特殊的 Infinity (無窮)值。任何沒法表示的負數以 -Infinity (負無窮大)表示,任何沒法表示的正數以 Infinity (正無窮大)表示。若是計算返回正 Infinity 或負 Infinity ,則該值將不能再進一步用於任何計算。這是由於 Infinity 沒有可用於計算的數值表示形式。要肯定一個值是否是有限大(即介於JavaScript能表示的最小值和最大值之間),可使用 isFinite() 函數 -
NaN
有一個特殊的數值叫 NaN ,意思是「不是數值」(Not a Number),用於表示原本要返回數值的操做失敗了(而不是拋出錯誤)。好比,用0除任意數值在其餘語言中一般都會致使錯誤,從而停止代碼執行。但在ECMAScript中,0、+0或-0相除會返回NaN -
數值轉換
有3個函數能夠將非數值轉換爲數值: Number() 、parseInt() 和 parseFloat() 。 Number() 是轉型函數,可用於任何數據類型。後兩個函數主要用於將字符串轉換爲數值。對於一樣的參數,這3個函數執行的操做也不一樣。
4-六、 NaN
有一個特殊的數值叫 NaN ,意思是「不是數值」(Not aNumber),用於表示原本要返回數值的操做失敗了(而不是拋出錯誤)。
4-七、數值轉換
有3個函數能夠將非數值轉換爲數值: Number() 、 parseInt() 和 parseFloat() 。 Number() 是轉型函數,可用於任何數據類型。後兩個函數主要用於將字符串轉換爲數值。對於一樣的參數,這3個函數執行的操做也不一樣。Number() 函數基於以下規則執行轉換。布爾值, true 轉換爲1, false 轉換爲0。
數值,直接返回。null ,返回0。 undefined ,返回 NaN 。
4-八、String 類型
String (字符串)數據類型表示零或多個16位Unicode字符序列。字符串可使用雙引號(")、單引號(’)或反引號(`)標示,
-
字符字面量
字符串數據類型包含一些字符字面量,用於表示非打印字符或有其餘用途的字符 -
字符串的特色
ECMAScript中的字符串是不可變的(immutable),意思是一旦建立,它們的值就不能變了。要修改某個變量中的字符串值,必須先銷燬原始的字符串,而後將包含新值的另外一個字符串保存到該變量 -
轉換爲字符串
有兩種方式把一個值轉換爲字符串。首先是使用幾乎全部值都有的 toString() 方法。這個方法惟一的用途就是返回當前值的字符串等價物 -
模板字面量
ECMAScript 6新增了使用模板字面量定義字符串的能力。與使用單引號或雙引號不一樣,模板字面量保留換行字符,能夠跨行定義字符串 -
字符串插值
模板字面量最經常使用的一個特性是支持字符串插值,也就是能夠在一個連續定義中插入一個或多個值。技術上講,模板字面量不是字符串,而是一種特殊的JavaScript句法表達式,只不過求值後獲得的是字符串。模板字面量在定義時當即求值並轉換爲字符串實例,任何插入的變量也會從它們最接近的做用域中取值 -
模板字面量標籤函數
模板字面量也支持定義標籤函數(tag function),而經過標籤函數能夠自定義插值行爲。標籤函數會接收被插值記號分隔後的模板和對每一個表達式求值的結果。標籤函數自己是一個常規函數,經過前綴到模板字面量來應用自定義行爲, -
原始字符串
使用模板字面量也能夠直接獲取原始的模板字面量內容(如換行符或Unicode字符),而不是被轉換後的字符表示。爲此,可使用默認的 String.raw 標籤函數
5、操做符
ECMA-262描述了一組可用於操做數據值的操做符,包括數學操做符(如加、減)、位操做符、關係操做符和相等操做符等。ECMAScript中的操做符是獨特的,由於它們可用於各類值,包括字符串、數值、布爾值,甚至還有對象。在應用給對象時,操做符一般會調用 valueOf() 和 / 或 toString() 方法來取得能夠計算的值。3.5.1 一元操做符只操做一個值的操做符叫一元操做符(unary operator)。一元操做符是ECMAScript中最簡單的操做符。
5-一、一元操做符
- 遞增 / 遞減操做符
遞增和遞減操做符直接照搬自C語言,但有兩個版本:前綴版和後綴版。顧名思義,前綴版就是位於要操做的變量前頭,後綴版就是位於要操做的變量後頭。前綴遞增操做符會給數值加1,把兩個加號( ++ )放到變量前頭便可
2.一元加和減
一元加和減操做符對大多數開發者來講並不陌生,它們在ECMAScript中跟在高中數學中的用途同樣。一元加由一個加號( + )表示,放在變量前頭,對數值沒有任何影響
5-二、位操做符
-
按位非
按位非操做符用波浪符( ~ )表示,它的做用是返回數值的一補數。按位非是ECMAScript中爲數很少的幾個二進制數學操做符之一 -
按位與
按位與操做符用和號( & )表示,有兩個操做數。本質上,按位與就是將兩個數的每個位對齊,而後基於真值表中的規則,對每一位執行相應的與操做。 -
按位或
按位或操做符用管道符( | )表示,一樣有兩個操做數。 -
按位異或
按位異或用脫字符( ^ )表示,一樣有兩個操做數 -
左移
左移操做符用兩個小於號( << )表示,會按照指定的位數將數值的全部位向左移動。好比,若是數值2(二進制10)向左移5位,就會獲得64(二進制1000000) -
有符號右移
有符號右移由兩個大於號( >> )表示,會將數值的全部32位都向右移,同時保留符號(正或負)。有符號右移其實是左移的逆運算 -
無符號右移
無符號右移用3個大於號表示( >>> ),會將數值的全部32位都向右移。對於正數,無符號右移與有符號右移結果相同
5-三、布爾操做符
-
邏輯非
邏輯非操做符由一個歎號( ! )表示,可應用給ECMAScript中的任何值。這個操做符始終返回布爾值,不管應用到的是什麼數據類型。邏輯非操做符首先將操做數轉換爲布爾值,而後再對其取反 -
邏輯與
邏輯與操做符由兩個和號( && )表示,應用到兩個值 -
邏輯或
邏輯或操做符由兩個管道符( || )表示
5-四、乘性操做符
-
乘法操做符
乘法操做符由一個星號( * )表示,能夠用於計算兩個數值的乘積。 -
除法操做符
除法操做符由一個斜槓( / )表示,用於計算第一個操做數除以第二個操做數的商 -
取模操做符
- 取模(餘數)操做符由一個百分比符號( % )表示
- 若是操做數是數值,則執行常規除法運算,返回餘數。
- 若是被除數是無限值,除數是有限值,則返回 NaN 。
- 若是被除數是有限值,除數是0,則返回 NaN 。
- 若是是 Infinity 除以 Infinity ,則返回 NaN 。
- 若是被除數是有限值,除數是無限值,則返回被除數。
- 若是被除數是0,除數不是0,則返回0。
- 若是有不是數值的操做數,則先在後臺用 Number() 函數將其轉換爲數值,而後再應用上述規則。
6、語句
ECMA-262描述了一些語句(也稱爲流控制語句),而ECMAScript中的大部分語法都體如今語句中。語句一般使用一或多個關鍵字完成既定的任務。語句能夠簡單,也能夠複雜。簡單的如告訴函數退出,複雜的如列出一堆要重複執行的指令。
6-一、do-while 語句
do-while 語句是一種後測試循環語句,即循環體中的代碼執
行後纔會對退出條件進行求值。換句話說,循環體內的代碼至少執行
一次
6-二、while 語句
while 語句是一種先測試循環語句,即先檢測退出條件,再執行循環體內的代碼。所以, while 循環體內的代碼有可能不會執行
7、函數
函數對任何語言來講都是核心組件,由於它們能夠封裝語句,而後在任何地方、任什麼時候間執行。ECMAScript中的函數使用function 關鍵字聲明,後跟一組參數,而後是函數體。
ECMAScript中的函數不須要指定是否返回值。任何函數在任什麼時候間均可以使用 return 語句來返回函數的值,用法是後跟要返回的值
函數 sum() 會將兩個值相加並返回結果。注意,除了 return語句以外沒有任何特殊聲明代表該函數有返回值
嚴格模式對函數也有一些限制:
函數不能以 eval 或 arguments 做爲名稱;
函數的參數不能叫 eval 或 arguments ;
兩個函數的參數不能叫同一個名稱。
8、變量,做用域與內存
4-一、原始值與引用值
ECMAScript變量能夠包含兩種不一樣類型的數據:原始值和引用值。原始值(primitive value)就是最簡單的數據,引用值(referencevalue)則是由多個值構成的對象。
在把一個值賦給變量時,JavaScript引擎必須肯定這個值是原始值仍是引用值。上一章討論了6種原始值: Undefined 、 Null 、Boolean 、 Number 、 String 和 Symbol 。保存原始值的變量是按值(by value)訪問的,由於咱們操做的就是存儲在變量中的實際值。
引用值是保存在內存中的對象。與其餘語言不一樣,JavaScript不容許直接訪問內存位置,所以也就不能直接操做對象所在的內存空間。在操做對象時,實際上操做的是對該對象的引用(reference)而非實
際的對象自己。爲此,保存引用值的變量是按引用(by reference)訪問的
注意:在不少語言中,字符串是使用對象表示的,所以被認爲是引用類型。ECMAScript打破了這個慣例。
-
動態屬性
原始值和引用值的定義方式很相似,都是建立一個變量,而後給它賦一個值。不過,在變量保存了這個值以後,能夠對這個值作什麼,則大有不一樣。對於引用值而言,能夠隨時添加、修改和刪除其屬性和方法 -
複製值
除了存儲方式不一樣,原始值和引用值在經過變量複製時也有所不一樣。在經過變量把一個原始值賦值到另外一個變量時,原始值會被複制到新變量的位置。
- 在把引用值從一個變量賦給另外一個變量時,存儲在變量中的值也會被複制到新變量所在的位置。區別在於,這裏複製的值其實是一個指針,它指向存儲在堆內存中的對象。操做完成後,兩個變量實際上指向同一個對象,所以一個對象上面的變化會在另外一個對象上反映出來
- 傳遞參數
ECMAScript中全部函數的參數都是按值傳遞的。這意味着函數外的值會被複制到函數內部的參數中,就像從一個變量複製到另外一個變量同樣。若是是原始值,那麼就跟原始值變量的複製同樣,若是是引用值,那麼就跟引用值變量的複製同樣。對不少開發者來講,這一塊可能會很差理解,畢竟變量有按值和按引用訪問,而傳參則只有按值傳遞
在按值傳遞參數時,值會被複制到一個局部變量(即一個命名參數,或者用ECMAScript的話說,就是 arguments 對象中的一個槽位)。在按引用傳遞參數時,值在內存中的位置會被保存在一個局部變量,這意味着對本地變量的修改會反映到函數外部
- 肯定類型
前一章提到的 typeof 操做符最適合用來判斷一個變量是否爲原始類型。更確切地說,它是判斷一個變量是否爲字符串、數值、布爾值或 undefined 的最好方式。若是值是對象或 null ,那麼typeof 返回 「object」
按照定義,全部引用值都是 Object 的實例,所以經過instanceof 操做符檢測任何引用值和 Object 構造函數都會返回 true 。相似地,若是用 instanceof 檢測原始值,則始終會返回 false ,由於原始值不是對象。
注意 typeof 操做符在用於檢測函數時也會返回 「function」 。當在Safari(直到Safari 5)和Chrome(直到Chrome 7)中用於檢測正則表達式時,因爲實現細節的緣由,typeof 也會返回 「function」 。ECMA-262規定,任何實現內部 [[Call]] 方法的對象都應該在 typeof 檢測時返回 「function」 。由於上述瀏覽器中的正則表達式實現了這個方法,因此 typeof 對正則表達式也返回 「function」 。在IE和Firefox中, typeof 對正則表達式返回 「object」 。
4-二、執行上下文與做用域
執行上下文(以上簡稱「上下文」)的概念在JavaScript中是頗爲重要的。變量或函數的上下文決定了它們能夠訪問哪些數據,以及它們的行爲。每一個上下文都有一個關聯的變量對象(variable object),而
這個上下文中定義的全部變量和函數都存在於這個對象上。雖然沒法經過代碼訪問變量對象,但後臺處理數據會用到它。
全局上下文是最外層的上下文。根據ECMAScript實現的宿主環境,表示全局上下文的對象可能不同。在瀏覽器中,全局上下文就是咱們常說的 window 對象(第12章會詳細介紹),所以全部經過
var 定義的全局變量和函數都會成爲 window 對象的屬性和方法。使用 let 和 const 的頂級聲明不會定義在全局上下文中,但在做用域鏈解析上效果是同樣的。上下文在其全部代碼都執行完畢後會被銷燬,包括定義在它上面的全部變量和函數(全局上下文在應用程序退出前纔會被銷燬,好比關閉網頁或退出瀏覽器)。
每一個函數調用都有本身的上下文。當代碼執行流進入函數時,函數的上下文被推到一個上下文棧上。在函數執行完以後,上下文棧會彈出該函數上下文,將控制權返還給以前的執行上下文。ECMAScript
程序的執行流就是經過這個上下文棧進行控制的。上下文中的代碼在執行的時候,會建立變量對象的一個做用域鏈(scope chain)。這個做用域鏈決定了各級上下文中的代碼在訪問變量和函數時的順序。代碼正在執行的上下文的變量對象始終位於做用域鏈的最前端。若是上下文是函數,則其活動對象(activationobject)用做變量對象。活動對象最初只有一個定義變量:arguments 。(全局上下文中沒有這個變量。)做用域鏈中的下一個變量對象來自包含上下文,再下一個對象來自再下一個包含上下文。以此類推直至全局上下文;全局上下文的變量對象始終是做用域鏈的最後一個變量對象
-
做用域鏈加強
雖然執行上下文主要有全局上下文和函數上下文兩種( eval()調用內部存在第三種上下文),但有其餘方式來加強做用域鏈。某些語句會致使在做用域鏈前端臨時添加一個上下文,這個上下文在代碼
執行後會被刪除。 -
變量聲明
ES6以後,JavaScript的變量聲明經歷了翻天覆地的變化。直到
ECMAScript 5.1, var 都是聲明變量的惟一關鍵字。ES6不只增長了
let 和 const 兩個關鍵字,並且還讓這兩個關鍵字壓倒性地超越
var 成爲首選。
-
使用 var 的函數做用域聲明
在使用 var 聲明變量時,變量會被自動添加到最接近的上下文。在函數中,最接近的上下文就是函數的局部上下文。在with 語句中,最接近的上下文也是函數上下文。若是變量未經聲明就被初始化了,那麼它就會自動被添加到全局上下文
注意:未經聲明而初始化變量是JavaScript編程中一個很是常見的錯誤,會致使不少問題。爲此,讀者在初始化變量以前必定要先聲明變量。在嚴格模式下,未經聲明就初始化變量會報錯
var 聲明會被拿到函數或全局做用域的頂部,位於做用域中全部代碼以前。這個現象叫做「提高」(hoisting)。提高讓同一做用域中的代碼沒必要考慮變量是否已經聲明就能夠直接使用。但是在實踐中,提高也會致使合法卻奇怪的現象,即在變量聲明以前使用變量。 -
使用 let 的塊級做用域聲明
ES6新增的 let 關鍵字跟 var 很類似,但它的做用域是塊級的,這也是JavaScript中的新概念。塊級做用域由最近的一對包含花括號 {} 界定。換句話說, if 塊、 while 塊、 function塊,甚至連單獨的塊也是 let 聲明變量的做用域。 -
使用 const 的常量聲明
除了 let ,ES6同時還增長了 const 關鍵字。使用 const 聲明的變量必須同時初始化爲某個值。一經聲明,在其生命週期的任什麼時候候都不能再從新賦予新值
注意 開發實踐代表,若是開發流程並不會所以而受很大影響,就應該儘量地多使用 const 聲明,除非確實須要一個未來會從新賦值的變量。這樣能夠從根本上保證提早發現從新賦值致使的bug
4-三、垃圾回收
JavaScript是使用垃圾回收的語言,也就是說執行環境負責在代碼執行時管理內存。在C和C++等語言中,跟蹤內存使用對開發者來講是個很大的負擔,也是不少問題的來源。JavaScript爲開發者卸下了這個負擔,經過自動內存管理實現內存分配和閒置資源回收。基本思路很簡單:肯定哪一個變量不會再使用,而後釋放它佔用的內存。這個過程是週期性的,即垃圾回收程序每隔必定時間(或者說在代碼執行過程當中某個預約的收集時間)就會自動運行。垃圾回收過程是一個近似且不完美的方案,由於某塊內存是否還有用,屬於「不可斷定的」問題,意味着靠算法是解決不了的。
咱們以函數中局部變量的正常生命週期爲例。函數中的局部變量會在函數執行時存在。此時,棧(或堆)內存會分配空間以保存相應的值。函數在內部使用了變量,而後退出。此時,就再也不須要那個局部變量了,它佔用的內存能夠釋放,供後面使用。這種狀況下顯然再也不須要局部變量了,但並非全部時候都會這麼明顯。垃圾回收程序必須跟蹤記錄哪一個變量還會使用,以及哪一個變量不會再使用,以便回收內存。如何標記未使用的變量也許有不一樣的實現方式。不過,在瀏覽器的發展史上,用到過兩種主要的標記策略:標記清理和引用計數。
-
標記清理
JavaScript最經常使用的垃圾回收策略是標記清理(mark-and-sweep)。當變量進入上下文,好比在函數內部聲明一個變量時,這個變量會被加上存在於上下文中的標記。而不在上下文中的變量,邏輯上講,永遠不該該釋放它們的內存,由於只要上下文中的代碼在運行,就有可能用到它們。當變量離開上下文時,也會被加上離開上下文的標記。
給變量加標記的方式有不少種。好比,當變量進入上下文時,反轉某一位;或者能夠維護「在上下文中」和「不在上下文中」兩個變量列表,能夠把變量從一個列表轉移到另外一個列表。標記過程的實現並不重要,關鍵是策略。
垃圾回收程序運行的時候,會標記內存中存儲的全部變量(記住,標記方法有不少種)。而後,它會將全部在上下文中的變量,以及被在上下文中的變量引用的變量的標記去掉。在此以後再被加上標記的變量就是待刪除的了,緣由是任何在上下文中的變量都訪問不到它們了。隨後垃圾回收程序作一次內存清理,銷燬帶標記的全部值並收回它們的內存。
到了2008年,IE、Firefox、Opera、Chrome和Safari都在本身的JavaScript實現中採用標記清理(或其變體),只是在運行垃圾回收的頻率上有所差別。 -
引用計數
另外一種沒那麼經常使用的垃圾回收策略是引用計數(referencecounting)。其思路是對每一個值都記錄它被引用的次數。聲明變量並給它賦一個引用值時,這個值的引用數爲1。若是同一個值又被賦給另外一個變量,那麼引用數加1。相似地,若是保存對該值引用的變量被其餘值給覆蓋了,那麼引用數減1。當一個值的引用數爲0時,就說明沒辦法再訪問到這個值了,所以能夠安全地收回其內存了。垃圾回收程序
下次運行的時候就會釋放引用數爲0的值的內存。引用計數最先由Netscape Navigator 3.0採用,但很快就遇到了嚴重的問題:循環引用。所謂循環引用,就是對象A有一個指針指向對象B,而對象B也引用了對象A。
- 把變量設置爲 null 實際上會切斷變量與其以前引用值之間的關係。當下次垃圾回收程序運行時,這些值就會被刪除,內存也會被回收。
爲了補救這一點,IE9把BOM和DOM對象都改爲了JavaScript對象,這同時也避免了因爲存在兩套垃圾回收算法而致使的問題,還消除了常見的內存泄漏現象。
- 內存泄漏
寫得很差的JavaScript可能出現難以察覺且有害的內存泄漏問題。在內存有限的設備上,或者在函數會被調用不少次的狀況下,內存泄漏多是個大問題。JavaScript中的內存泄漏大部分是由不合理的引用致使的
JavaScript變量能夠保存兩種類型的值:原始值和引用值。原始值多是如下6種原始數據類型之一: Undefined 、 Null 、Boolean 、 Number 、 String 和 Symbol 。原始值和引用值有如下特色。原始值大小固定,所以保存在棧內存上。
從一個變量到另外一個變量複製原始值會建立該值的第二個副本。引用值是對象,存儲在堆內存上。包含引用值的變量實際上只包含指向相應對象的一個指針,而不是對象自己。從一個變量到另外一個變量複製引用值只會複製指針,所以結果是兩個變量都指向同一個對象。
typeof 操做符能夠肯定值的原始類型,而 instanceof 操做符用於確保值的引用類型。任何變量(無論包含的是原始值仍是引用值)都存在於某個執行上下文中(也稱爲做用域)。這個上下文(做用域)決定了變量的生命週期,以及它們能夠訪問代碼的哪些部分。執行上下文能夠總結以下。
執行上下文分全局上下文、函數上下文和塊級上下文。
代碼執行流每進入一個新上下文,都會建立一個做用域鏈,用於搜索變量和函數。
函數或塊的局部上下文不只能夠訪問本身做用域內的變量,並且也能夠訪問任何包含上下文乃至全局上下文中的變量。
全局上下文只能訪問全局上下文中的變量和函數,不能直接訪問局部上下文中的任何數據。
變量的執行上下文用於肯定何時釋放內存。
JavaScript是使用垃圾回收的編程語言,開發者不須要操心內存分配和回收。JavaScript的垃圾回收程序能夠總結以下。
離開做用域的值會被自動標記爲可回收,而後在垃圾回收期間被刪除。
主流的垃圾回收算法是標記清理,即先給當前不使用的值加上標記,再回來回收它們的內存。
引用計數是另外一種垃圾回收策略,須要記錄值被引用了多少次。
JavaScript引擎再也不使用這種算法,但某些舊版本的IE仍然會受這種算法的影響,緣由是JavaScript會訪問非原生JavaScript對象(如DOM元素)。
引用計數在代碼中存在循環引用時會出現問題。
解除變量的引用不只能夠消除循環引用,並且對垃圾回收也有幫助。爲促進內存回收,全局對象、全局對象的屬性和循環引用都應該在不須要時解除引用。
9、基本引用類型
引用值(或者對象)是某個特定引用類型的實例。在ECMAScript中,引用類型是把數據和功能組織到一塊兒的結構,常常被人錯誤地稱做「類」。雖然從技術上講JavaScript是一門面向對象語言,但ECMAScript缺乏傳統的面向對象編程語言所具有的某些基本結構,包括類和接口。引用類型有時候也被稱爲對象定義,由於它們描述了本身的對象應有的屬性和方法。
注意 引用類型雖然有點像類,但跟類並非一個概念。爲避免混淆,本章後面不會使用術語「類」。
對象被認爲是某個特定引用類型的實例。新對象經過使用 new 操做符後跟一個構造函數(constructor)來建立。構造函數就是用來建立新對象的函數
9-一、Date
ECMAScript的 Date 類型參考了Java早期版本中的java.util.Date 。爲此, Date 類型將日期保存爲自協調世界時(UTC,Universal Time Coordinated)時間1970年1月1日午夜(零時)至今所通過的毫秒數。使用這種存儲格式, Date 類型能夠精確表示1970年1月1日以前及以後285 616年的日期。
-
要建立日期對象,就使用 new 操做符來調用 Date 構造函數:
let now = new Date();
-
在不給 Date 構造函數傳參數的狀況下,建立的對象將保存當前日期和時間。要基於其餘日期和時間建立日期對象,必須傳入其毫秒錶示(UNIX紀元1970年1月1日午夜以後的毫秒數)。ECMAScript爲此提供了兩個輔助方法: Date.parse() 和 Date.UTC() 。
Date.parse() 方法接收一個表示日期的字符串參數,嘗試將這個字符串轉換爲表示該日期的毫秒數。ECMA-262第5版定義了Date.parse() 應該支持的日期格式,填充了第3版遺留的空白
-
繼承的方法
與其餘類型同樣, Date 類型重寫了 toLocaleString() 、toString() 和 valueOf() 方法。但與其餘類型不一樣,重寫後這些方法的返回值不同。 Date 類型的 toLocaleString() 方法返回與瀏覽器運行的本地環境一致的日期和時間。這一般意味着格式中包含針對時間的AM(上午)或PM(下午),但不包含時區信息(具體格式可能因瀏覽器而不一樣)。 toString() 方法一般返回帶時區信息的日期和時間,而時間也是以24小時制(0~23)表示的。 -
日期格式化方法
- Date 類型有幾個專門用於格式化日期的方法,它們都會返回字符串:
- toDateString() 顯示日期中的周幾、月、日、年(格式特定於實現);
- toTimeString() 顯示日期中的時、分、秒和時區(格式特定於實現);
- toLocaleDateString() 顯示日期中的周幾、月、日、年(格式特定於實現和地區);
- toLocaleTimeString() 顯示日期中的時、分、秒(格式特定於實現);
- toUTCString() 顯示完整的UTC日期(格式特定於實現)。
- 這些方法的輸出與 toLocaleString() 和 toString() 同樣,會因瀏覽器而異。所以不能用於在用戶界面上一致地顯示日期。
注意 還有一個方法叫 toGMTString() ,這個方法跟toUTCString() 是同樣的,目的是爲了向後兼容。不過,規範建議新代碼使用 toUTCString() 。
- 日期/時間組件方法
Date 類型剩的方法(見下表)直接涉及取得或設置日期值的特定部分。注意表中「UTC日期」,指的是沒有時區偏移(將日期轉換爲GMT)時的日期。
方法 | 說明 |
---|---|
getTime() | 返回日期的毫秒錶示;與valueOf() 相同 |
setTime(milliseconds) | 設置日期的毫秒錶示,從而修改整個日期 |
getFullYear() | 返回4位數年(即2019而不是19) |
getUTCFullYear() | 返回UTC日期的4位數年 |
setFullYear( year ) | 設置日期的年( year 必須是4位數) |
導setUTCFullYear( year ) | 設置UTC日期的年( year 必須是4位數) |
getMonth() | 返回日期的月(0表示1月,11表示12月) |
getUTCMonth() | 返回UTC日期的月(0表示1月,11表示12月) |
setMonth( month) | ( month 爲大於0的數值,大於11加年) |
setUTCMonth( month) | 設置UTC日期的月( month 爲大於0的數值,大於11加年) |
getDate() | 返回日期中的日(1~31) |
getUTCDate() | 返回UTC日期中的日(1~31) |
setDate( date) | 設置日期中的日(若是 date 大於該月天數,則加月) |
setUTCDate( date | 設置UTC日期中的日(若是date 大於該月天數,則加月) |
getDay() | 返回日期中表示周幾的數值(0表示週日,6表示週六) |
getUTCDay() | 返回UTC日期中表示周幾的數值(0表示週日,6表示週六) |
getHours() | 返回日期中的時(0~23) |
getUTCHours() | 返回UTC日期中的時(0~23) |
setHours( hours ) | 設置日期中的時(若是 hours大於23,則加日) |
setUTCHours( hours ) | 設置UTC日期中的時(若是hours 大於23,則加日) |
getMinutes() | 返回日期中的分(0~59) |
getUTCMinutes() | 返回UTC日期中的分(0~59) |
setMinutes( minutes) | 設置日期中的分(若是minutes 大於59,則加時) |
setUTCMinutes( minutes ) | 設置UTC日期中的分(若是minutes 大於59,則加時) |
getSeconds() | 返回日期中的秒(0~59) |
getUTCSeconds() | 返回UTC日期中的秒(0~59) |
setSeconds( seconds ) | 設置日期中的秒(若是seconds 大於59,則加分) |
setUTCSeconds( seconds) | 設置UTC日期中的秒(若是seconds 大於59,則加分) |
getMilliseconds() | 返回日期中的毫秒 |
getUTCMilliseconds() | 返回UTC日期中的毫秒 |
setMilliseconds( milliseconds) | 設置日期中的毫秒 |
setUTCMilliseconds( milliseconds ) | 設置UTC日期中的毫秒 |
getTimezoneOffset() | 返回以分鐘計的UTC與本地時區的偏移量(如美國EST即「東部標準時間」返回300,進入夏令時的地區可能有所差別) |
9-二、RegExp
ECMAScript經過 RegExp 類型支持正則表達式。正則表達式使用相似Perl的簡潔語法來建立:
let expression = /pattern/flags;
這個正則表達式的 pattern (模式)能夠是任何簡單或複雜的正則表達式,包括字符類、限定符、分組、向前查找和反向引用。每一個正則表達式
能夠帶零個或多個 flags (標記),用於控制正則表達式的行爲。下面給
出了表示匹配模式的標記
- g :全局模式,表示查找字符串的所有內容,而不是找到第一個匹配的內容就結束。
- i :不區分大小寫,表示在查找匹配時忽略 pattern 和字符串的大小寫。
- m :多行模式,表示查找到一行文本末尾時會繼續查找。
- y :粘附模式,表示只查找從 lastIndex 開始及以後的字符串。
- u :Unicode模式,啓用Unicode匹配。
- s : dotAll 模式,表示元字符 . 匹配任何字符(包括 \n 或\r )。
- RegExp 實例屬性
每一個 RegExp 實例都有下列屬性,提供有關模式的各方面信息。
- global :布爾值,表示是否設置了 g 標記。
- ignoreCase :布爾值,表示是否設置了 i 標記。
- unicode :布爾值,表示是否設置了 u 標記。
- sticky :布爾值,表示是否設置了 y 標記。
- lastIndex :整數,表示在源字符串中下一次搜索的開始位置,始終從0開始。
- multiline :布爾值,表示是否設置了 m 標記。
- dotAll :布爾值,表示是否設置了 s 標記。
- source :正則表達式的字面量字符串(不是傳給構造函數的模式字符串),沒有開頭和結尾的斜槓。
- flags :正則表達式的標記字符串。始終以字面量而非傳入構造函數的字符串模式形式返回(沒有先後斜槓)。
-
RegExp 實例方法
RegExp 實例的主要方法是 exec() ,主要用於配合捕獲組使用。這個方法只接收一個參數,即要應用模式的字符串。若是找到了匹配項,則返
回包含第一個匹配信息的數組;若是沒找到匹配項,則返回 null 。返回
的數組雖然是 Array 的實例,但包含兩個額外的屬性: index 和
input 。 index 是字符串中匹配模式的起始位置, input 是要查找的
字符串。這個數組的第一個元素是匹配整個模式的字符串,其餘元素是與表
達式中的捕獲組匹配的字符串。若是模式中沒有捕獲組,則數組只包含一個
元素。 -
RegExp 構造函數屬性
RegExp 構造函數自己也有幾個屬性。(在其餘語言中,這種屬性被稱爲靜態屬性。)這些屬性適用於做用域中的全部正則表達式,並且會根據最後執行的正則表達式操做而變化。這些屬性還有一個特色,就是能夠經過兩種不一樣的方式訪問它們。換句話說,每一個屬性都有一個全名和一個簡寫。下表列出了 RegExp 構造函數的屬性。
全名 | 簡寫 | 說明 |
---|---|---|
input | $_ | 最後搜索的字符串 |
lastMatch | $& | 最後匹配的文本 |
lastParen | $+ | 最後匹配的捕獲組 |
leftContext | $` | input 字符串中出如今lastMatch 前面的文本 |
rightContext | $’ | input 字符串中出如今lastMatch 後面的文本 |
- 模式侷限
雖然ECMAScript對正則表達式的支持有了長足的進步,但仍然缺乏Perl
語言中的一些高級特性。參考Regular-Expressions.info網站
9-三、原始值包裝類型
爲了方便操做原始值,ECMAScript提供了3種特殊的引用類型:Boolean 、 Number 和 String 。這些類型具備本章介紹的其餘引用類型同樣的特色,但也具備與各自原始類型對應的特殊行爲。每當用到某個原始值的方法或屬性時,後臺都會建立一個相應原始包裝類型的對象,從而暴露出操做原始值的各類方法。
- Boolean
Boolean 是對應布爾值的引用類型。要建立一個 Boolean 對象,就使用 Boolean 構造函數並傳入 true 或 false
待更新。。。
9-四、單例內置對象
ECMA-262對內置對象的定義是「任何由ECMAScript實現提供、與宿主
環境無關,並在ECMAScript程序開始執行時就存在的對象」。這就意味着,
開發者不用顯式地實例化內置對象,由於它們已經實例化好了。前面咱們已
經接觸了大部份內置對象,包括 Object 、 Array 和 String 。本節介
紹ECMA-262定義的另外兩個單例內置對象: Global 和 Math 。
-
Global
Global 對象是ECMAScript中最特別的對象,由於代碼不會顯式地訪問它。ECMA-262規定 Global 對象爲一種兜底對象,它所針對的是不屬於任何對象的屬性和方法。事實上,不存在全局變量或全局函數這種東西。在全局做用域中定義的變量和函數都會變成 Global 對象的屬性 。本書前面介紹的函數,包括 isNaN() 、 isFinite() 、 parseInt() 和parseFloat() ,實際上都是 Global 對象的方法。除了這些,Global 對象上還有另一些方法。 -
URL編碼方法
encodeURI() 和 encodeURIComponent() 方法用於編碼統一資源標識符(URI),以便傳給瀏覽器。有效的URI不能包含某些字符,好比空格。使用URI編碼方法來編碼URI可讓瀏覽器可以理解它們,同時又以特殊的UTF-8編碼替換掉全部無效字符。ecnodeURI() 方法用於對整個URI進行編碼,好比 「www.wrox.com/illegal value.js」 。而encodeURIComponent() 方法用於編碼URI中單獨的組件,好比前面URL中的 「illegal value.js」 。這兩個方法的主要區別是,encodeURI() 不會編碼屬於URL組件的特殊字符,好比冒號、斜槓、問號、井號,而 encodeURIComponent() 會編碼它發現的全部非標準字符 -
eval() 方法
最後一個方法多是整個ECMAScript語言中最強大的了,它就是eval() 。這個方法就是一個完整的ECMAScript解釋器,它接收一個參數,即一個要執行的ECMAScript(JavaScript)字符串。
4.Global 對象屬性
Global 對象有不少屬性,其中一些前面已經提到過了。像undefined 、 NaN 和 Infinity 等特殊值都是 Global 對象的屬性。此外,全部原生引用類型構造函數,好比 Object 和Function ,也都是 Global 對象的屬性。
下表列出了全部這些屬性:
屬性 | 說明 |
---|---|
undefined | 特殊值undefined |
NaN | 特殊值NaN |
Infinity | 特殊值Infinity |
Object | Object的構造函數 |
Array | Array的構造函數 |
Function | Function的構造函數 |
Boolean | Boolean的構造函數 |
String | String的構造函數 |
Number | Number的構造函數 |
Date | Date的構造函數 |
RegExp | RegExp的構造函數 |
Symbol | Symbol的構造函數 |
Error | Error的構造函數 |
EvalError | EvalError的構造函數 |
RangeError | RangeError的構造函數 |
ReferenceError | ReferenceError 的構造函數 |
SyntaxError | SyntaxError的構造函數 |
TypeError | TypeError 的構造函數 |
URIError | URIError的構造函數 |
-
window 對象
雖然ECMA-262沒有規定直接訪問 Global 對象的方式,但瀏覽器將window 對象實現爲 Global 對象的代理。所以,全部全局做用域中聲明的變量和函數都變成了 window 的屬性 -
Math
ECMAScript提供了 Math 對象做爲保存數學公式、信息和計算的地方。 Math 對象提供了一些輔助計算的屬性和方法。
注意: Math 對象上提供的計算要比直接在JavaScript實現的快得多,因
爲 Math 對象上的計算使用了JavaScript引擎中更高效的實現和處理器指
令。但使用 Math 計算的問題是精度會因瀏覽器、操做系統、指令集和
硬件而異。
- Math 對象屬性
Math 對象有一些屬性,主要用於保存數學中的一些特殊值
屬性 | 說明 |
---|---|
Math.E | 天然對數的基數e的值 |
Math.LN10 | 10爲底的天然對數 |
Math.LN2 | 2爲底的天然對數 |
Math.LOG2E | 以2爲底e的對數 |
Math.LOG10E | 以10爲底e的對數 |
Math.PI | π的值 |
Math.SQRT1_2 | 1/2的平方根 |
Math.SQRT2 | 2的平方根 |
- min() 和 max() 方法
Math 對象也提供了不少輔助執行簡單或複雜數學計算的方法。min() 和 max() 方法用於肯定一組數值中的最小值和最大值。這兩個方法都接收任意多個參數
待更新。。。