亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

ECMAScript 2018 標準導讀

MiracleWong / 3455人閱讀

摘要:標準對象,語義由本規(guī)范定義的對象。三個冒號作為分隔符分割數字字符串文法的產生式。所有因為帶來的問題,基本上是占著茅坑不拉屎的行為導致。以數組測試操作為例,標準中的描述如下相對于來說,規(guī)范中增加了對的處理。

前言

本文是對《ECMAScript 2018 Language Specification》的解讀。
本文是對標準的概述性導讀,不是對 ES2018特性的詳細描述,也不會針對某個技術點進行詳細展開,但是會附上相關文章外鏈。

規(guī)格介紹

整個文檔有引言+27個章節(jié)+7篇附錄,大概五六百頁的樣子。

引言和前面3章部分,都是在講規(guī)格本身,跟JS語言本身無關。內容很少,可以快速過一遍。

Introduction 部分 介紹了語言歷史和標準化歷程;

前3章 Scope、Conformance、Normative References 主要介紹了文檔的范圍、一致性和參考文獻。所謂一致性,實際上是標準實現(xiàn)的一致性,任何實現(xiàn)ECMAScript 標準的語言,都必須完全實現(xiàn)文檔中描述的語法和語義,并且可以有規(guī)格之外的自定義程序語法。

語言概述

第4章 Overview 是對語言的整體介紹。涵蓋了Web腳本語言環(huán)境、ES基本概念和專業(yè)術語,以及嚴格模式的簡單介紹。這里跟大家分享幾個有意思的點。

奇葩的面向對象機制
ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a host environment. 
ES是一門面向對象的語言,這是官方描述!(這有什么奇怪的啊,大家都知道啊)但是ES的面向對象設計機制卻是與眾不同,大有學問(這有什么啊,不就原型鏈嘛)。我們多少都了解一些,但要完全講清楚,恐怕專門開一篇博客也不夠。

但我還是嘗試專門寫了一篇:《如何優(yōu)雅的解讀JS的面向對象機制》。

腳本語言的逆襲
ECMAScript was originally designed to be used as a scripting language, but has become widely used as a general-purpose programming language.

這個就有點屌了,ES最初是被拿來當Web腳本語言用的,但現(xiàn)在已經成了時下最流行的通用編程語言之一。此中緣由大家應該也很清楚,不多說,只是抒發(fā)一下感慨:Always bet on JS可不是亂說的。

有關對象的描述

本章還列舉出了JS中的專業(yè)名詞及解釋,比如類型、原始值、對象、構造器、原型......等概念。有意思的是標準中關于對象的描述在ES5里面有三種:

native object(原生對象),指語義完全由規(guī)范定義并且不摻雜任何宿主環(huán)境定義的的對象;

build-in object(內置對象),由ECMA實現(xiàn)提供,程序執(zhí)行時就存在的對象。所有內置對象都是原生對象。

host object(宿主對象),由執(zhí)行環(huán)境提供,比如瀏覽器的window對象和history對象。JS里的對象不是原生對象就是宿主對象。

但是在ES6之后就改成了四種:

ordinary object:普通對象,只要具備了對象的所有基本內置方法就可以了。

exotic object:外來對象,如果不具備標準對象所有的基本內置方法,就是外來對象。JS里的對象不是普通對象就是外來對象。

standard object:標準對象,語義由本規(guī)范定義的對象。

built-in object:內置對象,跟ES5中描述一樣。

對比來看,前者是以宿主環(huán)境為劃分條件,后者則是以對象的基本內置方法。ES6之后其實劃分的更細了。

記法約定

第5章 Notational Conventions 詳細介紹了規(guī)范描述中用到的一些句法、詞法以及算法約定等內容,如果要看懂后面的有關語法行為,函數實現(xiàn)的詳細描述,就得看懂這章,看完之后你甚至可以照著標準實現(xiàn)一遍。

這章涉及大量編譯基本知識,還是強烈建議花些時間看下,不然后面可能沒法繼續(xù)。你需要知道以下概念:

上下文無關文法

作為ECMAScript規(guī)格文檔,自然需要用一種專業(yè)的方式來描述這門語言,這種專業(yè)的描述語言的方法,就是所謂的文法(文法由若干產生式組成)。而上下文無關的意思,就是所有產生式的左邊只有一個非終結符,因為只有這樣,產生式右邊的串才能規(guī)約到左邊的非終結符,否則就是上下文相關。大部分編程語言都是上下文無關文法,ECMAScript也不例外。

詞法、正則文法、數字字符串文法和句法約定

一個冒號“:”作為分隔符分割句法的產生式。兩個冒號“::”作為分隔符分割詞法和正則的文法產生式。詞法和正則的文法共享某些產生式。三個冒號“:::”作為分隔符分割數字字符串文法的產生式。然后列舉了各種句法,文法標記,總之很多概念,此處不展開。

內部機制

第6到8章詳細描述了語言運行的內部機制,從宏觀上對ES進行描述,包括數據類型和值,語言內部的抽象操作,以及代碼執(zhí)行的上下文相關知識。

類型

ES中的類型可細分為ES語言類型和規(guī)范類型,語言類型對應的是程序中直接被操作的值的類型,包括Undefined,Null,Boolean,Number,String,Object,Symbol。理解類型,是理解這門語言的基礎。

首先是Undefind和Null,二者區(qū)別可參考 undefined與null的區(qū)別 - 阮一峰。在一門編程語言中對于“空”的描述用到了兩種基本類型,估計只有JavaScript了。其實一開始只有null,后來為了解決類型轉換和錯誤處理問題引入了undefined。

undefined 表示此處應該有個值,但是這個值還沒給出來,其實就是占了個坑,這個坑是語言內部實現(xiàn)幫你做的,你不用管。null 才是真正意義上的空值,表示對象世界中的“無”。正所謂道生一,一生二,二生三,三生萬物。JS中萬物皆對象,所有對象的原型鏈都可以上溯到唯一的Object,而Object的原型,正是萬物之始源,混沌之道null。所以JS中null的意義遠超其他編程語言,這正是讓JS的面向對象思想與道家哲學完美契合的重要一筆。

所以個人理解,Undefined雖然作為基本類型,解決的卻是語言內部處理問題,所以永遠不要在代碼中主動出現(xiàn),要在語義上處理空就用null。所有因為undefined帶來的問題,基本上是占著茅坑不拉屎的行為導致。所以google在Dart中就只有null,而沒有undefined,因為undefined解決的問題完全可以在語言內部解決,沒必要暴露給用戶。

Boolean和Symbol沒啥好說的,數值的設計也是從簡,只有一個Number類型。有意思的是String,官方對于String類型的描述:

The String type is the set of all ordered sequences of zero or more 16-bit unsigned integer values (“elements”) up to a maximum length of 2e53 - 1 elements. 
翻譯過來就是指所有有限的零個或多個16位無符號整數值的有序序列(共計2e53 - 1個元素)。這個2e53 - 1是怎么來的呢,按照16位無符號整數值計算的話?

更有意思的是,String中的每一個字符都被視為獨立的UTF-16代碼單元,即占2個字節(jié),作用在字符串上的所有操作都視它們?yōu)闊o差別的16位無符號整數(這里的UTF-16,其實是指內部實現(xiàn),計算機內存中都是基于unicode編碼的,只是在存儲或讀取時會進行UTF-8或者其他編碼類型轉換)。但是UTF-16卻有兩種長度的字符,U+0000到U+FFFF之間的字符占2個字節(jié),U+10000到U+10FFFF之間的字符占4字節(jié)。對于4字節(jié)的字符ES是無法準確處理的,需要自己去根據編碼值情況判斷,這也是一大坑爹之處。

對此,我也專門寫了一篇:《深入理解JavaScript中的String類型-未發(fā)布》。

除了以上語言類型,整個規(guī)范中還有用于描述這門語言的規(guī)范類型,規(guī)范類型的值是規(guī)范自己造的,有的還是ES表達式計算的中間結果,所以沒必要對應到特定的語言類型上。若非特別說明,ES中的類型通常指語言類型。

操作摘要

類型之間會涉及到各種運算,這就會涉及到各種操作運算。比如類型轉換涉及到的內部機制和算法流程,7.1 Type Conversion 都有詳細說明。7.2 Testing and Comparison Operations 講了測試和比較操作,比如測試一個對象是否是數組,是否數字,是否構造函數,以及 ===== 的定義等等。以數組測試操作isArray(argument)為例,標準中的描述如下:

1. If Type(argument) is not Object, return false.
2. If argument is an Array exotic object, return true.
3. If argument is a Proxy exotic object, then
    a. If argument.[[ProxyHandler]] is null, throw a TypeError exception.
    b. Let target be argument.[[ProxyTarget]].
    c. Return ? IsArray(target).
4. Return false.

相對于ES5來說,規(guī)范中增加了對Proxy的處理。我們再看 underscope v1.8.3 源碼中對isArray的實現(xiàn):

_.isArray = Array.isArray || function(obj) {
    return toString.call(obj) === "[object Array]";
}

相對于ES5來說,規(guī)范中增加了對Proxy的處理,目前來看這是引擎內部處理的,對現(xiàn)在很多檢測數組的方法并不影響。

語言實現(xiàn)細節(jié)

這是個大坑,還是附上ES2018正式版規(guī)范地址吧:

https://www.ecma-internationa...

如果想快速了解一下新特性,可以看這里:

https://medium.com/front-end-...

具體有哪些 finished proposals 可以參考 tc39 的 GitHub。

如何優(yōu)雅的閱讀ECMA標準

由于目前使用最為廣泛的還是ECMA 5.1版本,所以在閱讀ES2018之前,建議先把5.1的標準看一遍,方便對比。好在W3C中文站有5.1的100%翻譯版本:

ES5中文版: https://www.w3.org/html/ig/zh...

然后可以再看ES6也就是ES2015的標準,雖然沒有中文版,不過可以參考阮老師的ES6入門,順便也可以瞄一眼ES2016的標準:

ES 2015: http://www.ecma-international...
ECMAScript 6入門教程: http://es6.ruanyifeng.com/
ES 2016: http://www.ecma-international...

期間有任何疑惑可以參考MDN上的JS參考文檔,非常全面,涵蓋了從入門到精通。

https://developer.mozilla.org...

看完這些再看ES2018就會非常輕松了:

https://tc39.github.io/ecma262/

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/83634.html

相關文章

  • 如何優(yōu)雅的理解ECMAScript中的對象

    摘要:標準對象,語義由本規(guī)范定義的對象。這意味著雖然有,本質上依然是構造函數,并不能像那樣表演多繼承嵌套類等高難度動作。不過這里的并不是我們所說的數據類型,而是對象構造函數。 序 ECMAScript is an object-oriented programming language for performing computations and manipulating computat...

    why_rookie 評論0 收藏0
  • Spring AOP 源碼分析系列文章導讀

    摘要:在寫完容器源碼分析系列文章中的最后一篇后,沒敢懈怠,趁熱打鐵,花了天時間閱讀了方面的源碼。從今天開始,我將對部分的源碼分析系列文章進行更新。全稱是,即面向切面的編程,是一種開發(fā)理念。在中,切面只是一個概念,并沒有一個具體的接口或類與此對應。 1. 簡介 前一段時間,我學習了 Spring IOC 容器方面的源碼,并寫了數篇文章對此進行講解。在寫完 Spring IOC 容器源碼分析系列...

    張春雷 評論0 收藏0
  • 2017-06-27 前端日報

    摘要:前端日報精選漫談函數式編程一十年蹤跡的博客前端每周清單的優(yōu)勢與劣勢有望超越在嵌入式及物聯(lián)網的應用現(xiàn)狀進階系列高階組件詳解一前端之路譯如何充分利用控制臺掘金程序猿升級攻略眾成翻譯中文譯如何充分利用控制臺掘金前端從強制開啟壓縮探 2017-06-27 前端日報 精選 漫談 JS 函數式編程(一) - 十年蹤跡的博客前端每周清單: Vue的優(yōu)勢與劣勢;Node.js有望超越Java;JS在嵌...

    Eidesen 評論0 收藏0
  • 2017-06-25 前端日報

    摘要:前端日報精選標準導讀動感小前端的專欄大型網站前端使用圖片格式的正確姿勢騰訊前端大會現(xiàn)場筆記掘金在中學習數據結構與算法掘金周刊第期中文在中使用混合眾成翻譯已完結騰訊前端大會現(xiàn)場記錄掘金翻譯整合鼠標觸摸和觸控筆事件的掘金第期 2017-06-25 前端日報 精選 ECMAScript 2018 標準導讀 - 動感小前端的專欄 - SegmentFault大型網站前端使用圖片格式的正確姿勢騰...

    elarity 評論0 收藏0
  • Deep in JS - 收藏集 - 掘金

    摘要:今天同學去面試,做了兩道面試題全部做錯了,發(fā)過來給道典型的面試題前端掘金在界中,開發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標準參考教程(alpha) - 前端 - 掘金來自《JavaScript 標準參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實現(xiàn) 選擇排序 簡介 算法實現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經典面...

    enali 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<