成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ECMAScript 2018 標(biāo)準(zhǔn)導(dǎo)讀

MiracleWong / 3415人閱讀

摘要:標(biāo)準(zhǔn)對象,語義由本規(guī)范定義的對象。三個(gè)冒號作為分隔符分割數(shù)字字符串文法的產(chǎn)生式。所有因?yàn)閹淼膯栴},基本上是占著茅坑不拉屎的行為導(dǎo)致。以數(shù)組測試操作為例,標(biāo)準(zhǔn)中的描述如下相對于來說,規(guī)范中增加了對的處理。

前言

本文是對《ECMAScript 2018 Language Specification》的解讀。
本文是對標(biāo)準(zhǔn)的概述性導(dǎo)讀,不是對 ES2018特性的詳細(xì)描述,也不會(huì)針對某個(gè)技術(shù)點(diǎn)進(jìn)行詳細(xì)展開,但是會(huì)附上相關(guān)文章外鏈。

規(guī)格介紹

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

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

Introduction 部分 介紹了語言歷史和標(biāo)準(zhǔn)化歷程;

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

語言概述

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

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

但我還是嘗試專門寫了一篇:《如何優(yōu)雅的解讀JS的面向?qū)ο髾C(jī)制》。

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

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

有關(guān)對象的描述

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

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

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

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

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

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

exotic object:外來對象,如果不具備標(biāo)準(zhǔn)對象所有的基本內(nèi)置方法,就是外來對象。JS里的對象不是普通對象就是外來對象。

standard object:標(biāo)準(zhǔn)對象,語義由本規(guī)范定義的對象。

built-in object:內(nèi)置對象,跟ES5中描述一樣。

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

記法約定

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

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

上下文無關(guān)文法

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

詞法、正則文法、數(shù)字字符串文法和句法約定

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

內(nèi)部機(jī)制

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

類型

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

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

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

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

Boolean和Symbol沒啥好說的,數(shù)值的設(shè)計(jì)也是從簡,只有一個(gè)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. 
翻譯過來就是指所有有限的零個(gè)或多個(gè)16位無符號整數(shù)值的有序序列(共計(jì)2e53 - 1個(gè)元素)。這個(gè)2e53 - 1是怎么來的呢,按照16位無符號整數(shù)值計(jì)算的話?

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

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

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

操作摘要

類型之間會(huì)涉及到各種運(yùn)算,這就會(huì)涉及到各種操作運(yùn)算。比如類型轉(zhuǎn)換涉及到的內(nèi)部機(jī)制和算法流程,7.1 Type Conversion 都有詳細(xì)說明。7.2 Testing and Comparison Operations 講了測試和比較操作,比如測試一個(gè)對象是否是數(shù)組,是否數(shù)字,是否構(gòu)造函數(shù),以及 ===== 的定義等等。以數(shù)組測試操作isArray(argument)為例,標(biāo)準(zhǔn)中的描述如下:

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的實(shí)現(xiàn):

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

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

語言實(shí)現(xiàn)細(xì)節(jié)

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

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

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

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

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

如何優(yōu)雅的閱讀ECMA標(biāo)準(zhǔn)

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

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

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

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就會(huì)非常輕松了:

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/83634.html

相關(guān)文章

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

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

    why_rookie 評論0 收藏0
  • Spring AOP 源碼分析系列文章導(dǎo)讀

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

    張春雷 評論0 收藏0
  • 2017-06-27 前端日報(bào)

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

    Eidesen 評論0 收藏0
  • 2017-06-25 前端日報(bào)

    摘要:前端日報(bào)精選標(biāo)準(zhǔn)導(dǎo)讀動(dòng)感小前端的專欄大型網(wǎng)站前端使用圖片格式的正確姿勢騰訊前端大會(huì)現(xiàn)場筆記掘金在中學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法掘金周刊第期中文在中使用混合眾成翻譯已完結(jié)騰訊前端大會(huì)現(xiàn)場記錄掘金翻譯整合鼠標(biāo)觸摸和觸控筆事件的掘金第期 2017-06-25 前端日報(bào) 精選 ECMAScript 2018 標(biāo)準(zhǔn)導(dǎo)讀 - 動(dòng)感小前端的專欄 - SegmentFault大型網(wǎng)站前端使用圖片格式的正確姿勢騰...

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

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

    enali 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<