es5

ECMAScript 概述

  1. Javascript是一門編程語言,運行的環境是虛擬機(chrome是v8,別的瀏覽器也有),這個虛擬機在標準內稱作javascript的運行時,這個運行時本身就是javascript的宿主環境了,不過在瀏覽器端,也把瀏覽器稱作它的宿主環境(虛擬機寄宿在瀏覽器內)。

  2. ECMAScript 最初被設計爲 Web 腳本語言 ,提供了一種機制,使瀏覽器裏的網頁更加活躍,成爲基於 Web 的客戶 - 服務器架構的一部分執行服務器計算。ECMAScript 可以爲各種宿主環境提供核心的腳本功能,因此本文檔爲不依賴特定宿主環境的核心腳本語言作出規範。

概述

1.Web 腳本語言

WEB 瀏覽器爲引入客戶端計算能力而提供 ECMAScript 宿主環境,例如,它提供的對象有:windows,menus,pop-ups,dialog boxes,text areas,anchors,frames,history,cookies 及輸入 / 輸出等等。進一步來說,WEB 瀏覽器中提供的這種宿主環境,它提供了一種方式,使得腳本代碼可以去處理諸如改變焦點、頁面和圖片的加載、卸載、錯誤和放棄,選擇,表單提交和鼠標交互等等事件。腳本代碼出現在 HTML 中,顯示出來的頁面是一個用戶接口元素與固定的和計算出來的文本和圖片的集合。腳本代碼根據用戶的交互而做出反應,並不需要存在一個主程序。

WEB 服務器爲了服務端的計算則提供了一個完全不一樣的宿主環境,包括的對象有:requests,clients,files 以及數據鎖定和分享的機制。通過瀏覽器端腳本及服務端腳本的配合使用,在爲基於 WEB 方式的應用程序提供定製的用戶接口時,可以將計算分佈到客戶端和服務端進行。

每一種支持 ECMAScript 的 WEB 瀏覽器和服務器都將它們自身的宿主環境作爲 ECMAScript 的補充,以使得 ECMAScript 的執行環境變得完整。

2.語言概述

ECMAScript 是基於對象的:基本語言和宿主設施都由對象提供,ECMAScript 程序是一組可通信的對象。ECMAScript 對象 (objects) 是 屬性 (properties) 的集合,每個屬性有零個或多個 特性 (attributes),它確定怎樣使用此屬性。例如,當設置一個屬性的 Writable 特性爲 false 時,任何試圖更改此屬性值的 ECMAScript 代碼的都會運行失敗。屬性是持有其他 對象 (objects), 原始值 (primitive values), 函數 (functions) 的容器。原始值是以下內置類型之一的成員:Undefined,Null,Boolean,Number,String;對象是剩下的內置類型 Object 的成員;函數是可調用對象 (callable object)。方法 (method) 是通過屬性與對象關聯的函數。

ECMAScript 定義一組內置對象 (built-in objects),勾勒出 ECMAScript 實體的定義。這些內置對象包括 全局對象 (global object) ,Object 對象 ,Function 對象 ,Array 對象 ,String 對象 ,Boolean 對象 ,Number 對象 ,Math 對象 ,Date 對象 ,RegExp 對象 ,JSON 對象,和 Error 對象: Error ,EvalError ,RangeError ,ReferenceError ,SyntaxError ,TypeError ,URIError 。

ECMAScript 中還定義一組內置運算符 (operators)。ECMAScript 運算符包括 一元運算符 ,乘法運算符 ,加法運算符 ,按位移位運算符 ,關係運算符 ,相等運算符 ,二進制位運算符 ,二進制邏輯運算符 ,賦值運算符 ,逗號運算符。

ECMAScript 語法有意設計成與 Java 語法類似。ECMAScript 的語法是鬆散的,使其能夠作爲一個易於使用的腳本語言。例如,一個變量不需要有類型聲明,屬性也不需要與類型關聯,定義的函數也不需要聲明在函數調用詞句的前面。

3.對象

對象可以通過各種方式創建,包括字面符號,或通過 構造器 創建對象然後運行代碼初始化其全部或部分屬性值,爲這些屬性分配初始值。每個構造器是一個擁有名爲“prototype”的屬性的函數。此屬性用於實現 基於原型的繼承 和 共享屬性 。構造器通過 new 表達式創建對象:例如,new Date(2009,11) 創建一個新 Date 對象。不使用 new 調用一個構造器的結果,依賴構造器本身。例如,Date() 產生一個表示當前日期時間的字符串,而不是一個對象。
不同於基於類的對象語言,屬性可以通過賦值的方式動態添加給對象。也就是說,構造器並不是非要對構造的對象的全部或任何屬性命名或賦值。

4.ECMAScript 的嚴格模式變體

ECMAScript 語言認可有些用戶希望限制使用語言中某些功能的可能性。他們這樣做可能是爲了安全考慮,避免他們認爲是容易出錯的功能,獲得增強的錯誤檢查,或其他原因。爲了支持這種可能性,ECMAScript 中定義了語言的嚴格變體。語言的嚴格變體,排除了 ECMAScript 語言的某些特定的語法和語義特徵,還修改了某些功能的詳細語義。嚴格變體還指定了必須拋出錯誤異常報告的額外錯誤條件,即使在非嚴格的語言形式下這些條件不屬於錯誤。

ECMAScript 的嚴格變體通常被稱爲語言的 嚴格模式 (strict mode)。嚴格模式選擇使用的 ECMAScript 嚴格模式的語法和語義,明確地適用於個別 ECMAScript 代碼單元級別。由於嚴格模式適用於選擇的語法代碼單元級別,嚴格模式僅在這個代碼單元內施加有局部效果的限制。嚴格模式不限制或修改任何必須運行在多個代碼單元的 ECMAScript 語義層面。一個 ECMAScript 程序可由嚴格模式和非嚴格模式的代碼單元組成。在這種情況下,嚴格的模式只適用於嚴格模式代碼單元內實際執行的代碼。

要符合這一規範,ECMAScript的實現必須同時實現未限制的ECMAScript    語言和按照這個規範定義的ECMAScript的嚴格模式變體。此外,實現還必須支持未限制的和嚴格模式代碼單元的在同一個程序中混用。.

5.術語定義

(1)原始值 (primitive value):原始值直接代表語言實現的最底層的數據。
(2)對象 (object)
對象類型的成員。
對象是屬性的集合,並有一個原型對象。原型可以是空值。
(3)構造器 (constructor):
創建和初始化對象的函數對象。
構造器的“prototype”屬性值是一個原型對象,它用來實現繼承和共享屬性。
(4)原型 (prototype)
爲其他對象提供共享屬性的對象。
當構造器創建一個對象,爲了解決對象的屬性引用,該對象會隱式引用構造器的“prototype”屬性。通過程序表達式 constructor.prototype 可以引用到構造器的“prototype”屬性,並且添加到對象原型裏的屬性,會通過繼承與所有共享此原型的對象共享。另外,可使用 Object.create 內置函數,通過明確指定原型來創建一個新對象。
(5)原生對象 (native object)
ECMAScript 實現中,並非由宿主環境,而是完全由本規範定義其語義的對象。
標準的原生對象由本規範定義。一些原生對象是內置的,其他的可在 ECMAScript 程序執行過程中構建。
(6)內置對象 (built-in object)
由 ECMAScript 實現提供,獨立於宿主環境的對象,ECMAScript 程序開始執行時就存在。
標準的內置對象由本規範定義,ECMAScript 實現可以指定和定義其他的。所有內置對象是原生對象。一個內置構造器 (built-in constructor) 是個內置對象,也是個構造器。
(7)宿主對象 (host object)
由宿主環境提供的對象,用於完善 ECMAScript 執行環境。
任何對象,不是原生對象就是宿主對象。
(8)布爾對象 (Boolean object)
對象類型的成員,它是標準內置構造器 Boolean 的一個實例。
通過使用 new 表達式,以一個布爾值作爲參數調用 Boolean 構造器來創建布爾對象。由此產生的對象包含一個值爲此布爾值的內部屬性。一個 Boolean 對象可以強制轉換爲布爾值。
(9)字符串值 (String value)
原始值,它是零個或多個 16 位無符號整數組成的有限有序序列。
一個字符串值是字符串類型的成員。通常序列中的每個整數值代表 UTF-16 文本的單個 16 位單元。然而,對於其值,ECMAScript 只要求必須是 16 位無符號整數,除此之外沒有任何限制或要求。
(10)NaN
值爲 IEEE 754“Not-a-Number”的數字值

記法約定

1.語法和詞法的文法

(1) 一個 上下文無關文法 由一定數量的 產生式 (productions) 組成。每個產生式的 左邊 (left-hand side) 是一個被稱爲非終結符 (nonterminal) 的抽象符號, 右邊 (right-hand side) 是零或多個非終結符和 終結符 (terminal symbols) 的有序排列。任何文法,它的終結符都來自指定的字母集。

當從一個叫做 目標符 (goal symbol) 的特殊非終端符組成的句子起始,那麼給出的上下文無關文法就表示 語言 (language),即,將產生式右邊序列的非終結符當作左邊,進行反覆替換的結果就成爲可能的終結符序列集合(可能無限)。
(2)詞法和正則的文法
 空白和註釋之外的輸入元素構成 ECMAScript 語法文法的終結符,它們被稱爲 ECMAScript 的 tokens。這些 tokens 是,ECMAScript 語言的保留字,標識符,字面量,標點符號。此外,行結束符雖然不被視爲 tokens,但會成爲輸入元素流的一部分,用於引導處理自動插入分號( 7.9 )。空白和單行註釋會被簡單的丟棄,不會出現在語法文法的輸入元素的流中。如果一個 多行註釋 (MultiLineComment)(即形式爲“/ ... /”的註釋,不管是否跨越多行)不包含行結束符也會簡單地丟棄,但如果一個 多行註釋 包含一個或多個結束符,那麼,註釋會被替換爲一個行結束符,成爲語法文法輸入元素流的一部分。
  只用一個冒號“:”作爲分隔符分割語法詞法的產生式。
  兩個冒號“::”作爲分隔符分割詞法和正則的文法產生式。詞法和正則的文法共享某些產生式。
 三 冒號“:::”作爲分隔符分割數字字符串文法的產生式。
(3)數字字符串文法
   用於轉換字符串爲數字值的一種文法。此文法與詞法文法的一部分(與數字字面量有關的)類似,並且有終結符 SourceCharacter。
(4)語法文法
(5)JSON 文法
   JSON 文法用於將描述 ECMAScript 對象的字符串轉換爲實際的對象。
   兩個冒號“::”作爲分隔符分割 JSON 詞法文法的產生式。JSON 詞法文法使用某些 ECMAScript 詞法文法的產生式。JSON 語法文法與 ECMAScript 語法文法類似。JSON 語法文法產生式被一個冒號“:”作爲分隔符分割。
(6) 文法標記法
 因此,非終結 IterationStatement 實際上有 8 個右側變體。
 如果文法定義的冒號後面出現文字“one of”,那麼其後一行或多行出現的每個終結符都是一個選擇定義。例如,ECMAScript 包含的詞法文法生   產器:
 NonZeroDigit :: one of
 1 2 3 4 5 6 7 8  9
如果產生式的右側是出現“[empty]”,它表明,產生式的右側不包含終結符或非終結符。
  如果產生式的右側出現“[lookahead ∉ set]”,它表明,給定 set 的成員不得成爲產生式緊隨其後的 token。這個 set 可以寫成一個大括號括起來的終結符列表。爲方便起見,set 也可以寫成一個非終結符,在這種情況下,它代表了這個非終結符 set 可擴展所有終結符。例如,給出定義
DecimalDigit :: one of
0 1 2 3 4 5 6 7 8 9
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
在定義
LookaheadExample ::
n [lookahead ∉ {1 , 3 , 5 , 7 , 9}]DecimalDigits
DecimalDigit [lookahead ∉ DecimalDigit ]
當一個詞法文法產生式或數字字符串文法中出現多字符 token,它表示此字符序列將註冊一個 token。
使用詞組“but not“可以指定某些不允許在產生式右側的擴展,它說明排除這個擴展。例如,產生式:

2.算法約定

此規範通常使用帶編號的列表來指定算法的步驟。這些算法是用來精確地指定 ECMAScript 語言結構所需的語義。該算法無意暗示任何具體實現使用的技術。在實踐中,也許可用更有效的算法實現一個給定功能。
爲了表達清晰,算法的步驟可細分爲有序的子步驟。子步驟被縮進,可以將自身進一步劃分爲縮進子步驟。大綱編號約定用於識別分步驟,第一層次的子步驟適用小寫字母標記,第二層次的子步驟使用小寫羅馬數字標記。如果需要超過三個層次,則重複這些規則,第四層次使用數字標記。例如 :
 1.Top-level step
   a.Substep.
    b.Substep
      i.Subsubstep.
      ii.Subsubstep.
        1.Subsubsubstep
           a.Subsubsubsubstep
  如果算法定義“拋出一個異常”,算法的執行將被終止,且沒有返回結果。已調用的算法也被終止,直到算法步驟使用術語“如果一個異常被拋出 ...”明確指出異常處理。一旦遇到這種算法步驟,異常將不再被視已發生過。
源代碼文本
 用 3.0 或更高版本 Unicode 字符編碼的一個字符序列來表示 ECMAScript 源文本。該文本預期已經正常化爲 Unicode Technical Report #15 中描述的 Unicode 正常化形式 C(canonical composition)。符合 ECMAScript 的實現不要求對文本執行正常化,也不要求將其表現爲像執行了正常化一樣。爲了目的,此規範 ECMAScript 的源文本被假定爲一個 16 位代碼單元,本規範的目的序列。這樣的包含 16 位代碼單元序列的源文本可能不是有效的的 UTF-16 字符編碼。如果實際的源文本沒有用 16 位代碼單元形式編碼,那麼必須把它看作已經轉換爲 UTF-16 一樣處理。
 語法:

ES5新特性:理解 Array 中增強的 9 個 API

  1. 爲了更方便的對JS中Array的操作,ES5規範在Array的原型上新增了 9個 方法,分別是forEach、filter、map、reduce、reduceRight、some、every、indexOf 和 lastIndexOf,本文將對這幾個方法進行詳細的講解,並對每一個方法進行原型擴展,以兼容不支持ES5的瀏覽器.

    2.forEach(callback[,thisArg])

    var arr=[‘a’,’b’,’c’];
    arr.forEach(function(v,i,r){
    console.log(v,i,r);
    })
    從輸出的接口可以看出,callback中傳入了3個參數v,i,r 分別表示當前元素、當前位置、數組對象。再看看使用thisArg的例子:
    var obj={
    print:function(a,b){
    console.log(a,b);
    }
    };
    var arr=[‘a’,’b’,’c’];
    arr.forEach(function(v,i,a){
    this.print(v,i);
    },obj);
    不傳thisArgs時,callback中的 this 默認指向window對象,當傳遞thisArg時,callback中的this就指向了thisArg,因此這個參數的目的就是爲了改變回調函數中的this指向。
    對於不支持ES5的瀏覽器,我們可以對forEach進行簡單的擴展來兼容老的瀏覽器
    if(!Array.prototype.forEach){
    Array.prototype.forEach=function(callback,thisArg){
    for (var i=0;i

發佈了28 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章