摘要:標(biāo)準(zhǔn)對(duì)象,語(yǔ)義由本規(guī)范定義的對(duì)象。三個(gè)冒號(hào)作為分隔符分割數(shù)字字符串文法的產(chǎn)生式。所有因?yàn)閹?lái)的問(wèn)題,基本上是占著茅坑不拉屎的行為導(dǎo)致。以數(shù)組測(cè)試操作為例,標(biāo)準(zhǔn)中的描述如下相對(duì)于來(lái)說(shuō),規(guī)范中增加了對(duì)的處理。
前言
本文是對(duì)《ECMAScript 2018 Language Specification》的解讀。
本文是對(duì)標(biāo)準(zhǔn)的概述性導(dǎo)讀,不是對(duì) ES2018特性的詳細(xì)描述,也不會(huì)針對(duì)某個(gè)技術(shù)點(diǎn)進(jìn)行詳細(xì)展開(kāi),但是會(huì)附上相關(guān)文章外鏈。
整個(gè)文檔有引言+27個(gè)章節(jié)+7篇附錄,大概五六百頁(yè)的樣子。
引言和前面3章部分,都是在講規(guī)格本身,跟JS語(yǔ)言本身無(wú)關(guān)。內(nèi)容很少,可以快速過(guò)一遍。
Introduction 部分 介紹了語(yǔ)言歷史和標(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)的語(yǔ)言,都必須完全實(shí)現(xiàn)文檔中描述的語(yǔ)法和語(yǔ)義,并且可以有規(guī)格之外的自定義程序語(yǔ)法。
語(yǔ)言概述第4章 Overview 是對(duì)語(yǔ)言的整體介紹。涵蓋了Web腳本語(yǔ)言環(huán)境、ES基本概念和專(zhuān)業(yè)術(shù)語(yǔ),以及嚴(yán)格模式的簡(jiǎ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是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,這是官方描述!(這有什么奇怪的啊,大家都知道啊)但是ES的面向?qū)ο笤O(shè)計(jì)機(jī)制卻是與眾不同,大有學(xué)問(wèn)(這有什么啊,不就原型鏈嘛)。我們多少都了解一些,但要完全講清楚,恐怕專(zhuān)門(mén)開(kāi)一篇博客也不夠。
但我還是嘗試專(zhuān)門(mén)寫(xiě)了一篇:《如何優(yōu)雅的解讀JS的面向?qū)ο髾C(jī)制》。
腳本語(yǔ)言的逆襲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最初是被拿來(lái)當(dāng)Web腳本語(yǔ)言用的,但現(xiàn)在已經(jīng)成了時(shí)下最流行的通用編程語(yǔ)言之一。此中緣由大家應(yīng)該也很清楚,不多說(shuō),只是抒發(fā)一下感慨:Always bet on JS可不是亂說(shuō)的。
有關(guān)對(duì)象的描述本章還列舉出了JS中的專(zhuān)業(yè)名詞及解釋?zhuān)热珙?lèi)型、原始值、對(duì)象、構(gòu)造器、原型......等概念。有意思的是標(biāo)準(zhǔn)中關(guān)于對(duì)象的描述在ES5里面有三種:
native object(原生對(duì)象),指語(yǔ)義完全由規(guī)范定義并且不摻雜任何宿主環(huán)境定義的的對(duì)象;
build-in object(內(nèi)置對(duì)象),由ECMA實(shí)現(xiàn)提供,程序執(zhí)行時(shí)就存在的對(duì)象。所有內(nèi)置對(duì)象都是原生對(duì)象。
host object(宿主對(duì)象),由執(zhí)行環(huán)境提供,比如瀏覽器的window對(duì)象和history對(duì)象。JS里的對(duì)象不是原生對(duì)象就是宿主對(duì)象。
但是在ES6之后就改成了四種:
ordinary object:普通對(duì)象,只要具備了對(duì)象的所有基本內(nèi)置方法就可以了。
exotic object:外來(lái)對(duì)象,如果不具備標(biāo)準(zhǔn)對(duì)象所有的基本內(nèi)置方法,就是外來(lái)對(duì)象。JS里的對(duì)象不是普通對(duì)象就是外來(lái)對(duì)象。
standard object:標(biāo)準(zhǔn)對(duì)象,語(yǔ)義由本規(guī)范定義的對(duì)象。
built-in object:內(nèi)置對(duì)象,跟ES5中描述一樣。
對(duì)比來(lái)看,前者是以宿主環(huán)境為劃分條件,后者則是以對(duì)象的基本內(nèi)置方法。ES6之后其實(shí)劃分的更細(xì)了。
記法約定第5章 Notational Conventions 詳細(xì)介紹了規(guī)范描述中用到的一些句法、詞法以及算法約定等內(nèi)容,如果要看懂后面的有關(guān)語(yǔ)法行為,函數(shù)實(shí)現(xiàn)的詳細(xì)描述,就得看懂這章,看完之后你甚至可以照著標(biāo)準(zhǔn)實(shí)現(xiàn)一遍。
這章涉及大量編譯基本知識(shí),還是強(qiáng)烈建議花些時(shí)間看下,不然后面可能沒(méi)法繼續(xù)。你需要知道以下概念:
上下文無(wú)關(guān)文法作為ECMAScript規(guī)格文檔,自然需要用一種專(zhuān)業(yè)的方式來(lái)描述這門(mén)語(yǔ)言,這種專(zhuān)業(yè)的描述語(yǔ)言的方法,就是所謂的文法(文法由若干產(chǎn)生式組成)。而上下文無(wú)關(guān)的意思,就是所有產(chǎn)生式的左邊只有一個(gè)非終結(jié)符,因?yàn)橹挥羞@樣,產(chǎn)生式右邊的串才能規(guī)約到左邊的非終結(jié)符,否則就是上下文相關(guān)。大部分編程語(yǔ)言都是上下文無(wú)關(guān)文法,ECMAScript也不例外。
詞法、正則文法、數(shù)字字符串文法和句法約定一個(gè)冒號(hào)“:”作為分隔符分割句法的產(chǎn)生式。兩個(gè)冒號(hào)“::”作為分隔符分割詞法和正則的文法產(chǎn)生式。詞法和正則的文法共享某些產(chǎn)生式。三個(gè)冒號(hào)“:::”作為分隔符分割數(shù)字字符串文法的產(chǎn)生式。然后列舉了各種句法,文法標(biāo)記,總之很多概念,此處不展開(kāi)。
內(nèi)部機(jī)制第6到8章詳細(xì)描述了語(yǔ)言運(yùn)行的內(nèi)部機(jī)制,從宏觀上對(duì)ES進(jìn)行描述,包括數(shù)據(jù)類(lèi)型和值,語(yǔ)言?xún)?nèi)部的抽象操作,以及代碼執(zhí)行的上下文相關(guān)知識(shí)。
類(lèi)型ES中的類(lèi)型可細(xì)分為ES語(yǔ)言類(lèi)型和規(guī)范類(lèi)型,語(yǔ)言類(lèi)型對(duì)應(yīng)的是程序中直接被操作的值的類(lèi)型,包括Undefined,Null,Boolean,Number,String,Object,Symbol。理解類(lèi)型,是理解這門(mén)語(yǔ)言的基礎(chǔ)。
首先是Undefind和Null,二者區(qū)別可參考 undefined與null的區(qū)別 - 阮一峰。在一門(mén)編程語(yǔ)言中對(duì)于“空”的描述用到了兩種基本類(lèi)型,估計(jì)只有JavaScript了。其實(shí)一開(kāi)始只有null,后來(lái)為了解決類(lèi)型轉(zhuǎn)換和錯(cuò)誤處理問(wèn)題引入了undefined。
undefined 表示此處應(yīng)該有個(gè)值,但是這個(gè)值還沒(méi)給出來(lái),其實(shí)就是占了個(gè)坑,這個(gè)坑是語(yǔ)言?xún)?nèi)部實(shí)現(xiàn)幫你做的,你不用管。null 才是真正意義上的空值,表示對(duì)象世界中的“無(wú)”。正所謂道生一,一生二,二生三,三生萬(wàn)物。JS中萬(wàn)物皆對(duì)象,所有對(duì)象的原型鏈都可以上溯到唯一的Object,而Object的原型,正是萬(wàn)物之始源,混沌之道null。所以JS中null的意義遠(yuǎn)超其他編程語(yǔ)言,這正是讓JS的面向?qū)ο笏枷肱c道家哲學(xué)完美契合的重要一筆。
所以個(gè)人理解,Undefined雖然作為基本類(lèi)型,解決的卻是語(yǔ)言?xún)?nèi)部處理問(wèn)題,所以永遠(yuǎn)不要在代碼中主動(dòng)出現(xiàn),要在語(yǔ)義上處理空就用null。所有因?yàn)閡ndefined帶來(lái)的問(wèn)題,基本上是占著茅坑不拉屎的行為導(dǎo)致。所以google在Dart中就只有null,而沒(méi)有undefined,因?yàn)閡ndefined解決的問(wèn)題完全可以在語(yǔ)言?xún)?nèi)部解決,沒(méi)必要暴露給用戶(hù)。
Boolean和Symbol沒(méi)啥好說(shuō)的,數(shù)值的設(shè)計(jì)也是從簡(jiǎn),只有一個(gè)Number類(lèi)型。有意思的是String,官方對(duì)于String類(lèi)型的描述:
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.
翻譯過(guò)來(lái)就是指所有有限的零個(gè)或多個(gè)16位無(wú)符號(hào)整數(shù)值的有序序列(共計(jì)2e53 - 1個(gè)元素)。這個(gè)2e53 - 1是怎么來(lái)的呢,按照16位無(wú)符號(hào)整數(shù)值計(jì)算的話(huà)?
更有意思的是,String中的每一個(gè)字符都被視為獨(dú)立的UTF-16代碼單元,即占2個(gè)字節(jié),作用在字符串上的所有操作都視它們?yōu)闊o(wú)差別的16位無(wú)符號(hào)整數(shù)(這里的UTF-16,其實(shí)是指內(nèi)部實(shí)現(xiàn),計(jì)算機(jī)內(nèi)存中都是基于unicode編碼的,只是在存儲(chǔ)或讀取時(shí)會(huì)進(jìn)行UTF-8或者其他編碼類(lèi)型轉(zhuǎn)換)。但是UTF-16卻有兩種長(zhǎng)度的字符,U+0000到U+FFFF之間的字符占2個(gè)字節(jié),U+10000到U+10FFFF之間的字符占4字節(jié)。對(duì)于4字節(jié)的字符ES是無(wú)法準(zhǔn)確處理的,需要自己去根據(jù)編碼值情況判斷,這也是一大坑爹之處。
對(duì)此,我也專(zhuān)門(mén)寫(xiě)了一篇:《深入理解JavaScript中的String類(lèi)型-未發(fā)布》。
除了以上語(yǔ)言類(lèi)型,整個(gè)規(guī)范中還有用于描述這門(mén)語(yǔ)言的規(guī)范類(lèi)型,規(guī)范類(lèi)型的值是規(guī)范自己造的,有的還是ES表達(dá)式計(jì)算的中間結(jié)果,所以沒(méi)必要對(duì)應(yīng)到特定的語(yǔ)言類(lèi)型上。若非特別說(shuō)明,ES中的類(lèi)型通常指語(yǔ)言類(lèi)型。
操作摘要類(lèi)型之間會(huì)涉及到各種運(yùn)算,這就會(huì)涉及到各種操作運(yùn)算。比如類(lèi)型轉(zhuǎn)換涉及到的內(nèi)部機(jī)制和算法流程,7.1 Type Conversion 都有詳細(xì)說(shuō)明。7.2 Testing and Comparison Operations 講了測(cè)試和比較操作,比如測(cè)試一個(gè)對(duì)象是否是數(shù)組,是否數(shù)字,是否構(gòu)造函數(shù),以及 == 和 === 的定義等等。以數(shù)組測(cè)試操作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.
相對(duì)于ES5來(lái)說(shuō),規(guī)范中增加了對(duì)Proxy的處理。我們?cè)倏?underscope v1.8.3 源碼中對(duì)isArray的實(shí)現(xiàn):
_.isArray = Array.isArray || function(obj) { return toString.call(obj) === "[object Array]"; }
相對(duì)于ES5來(lái)說(shuō),規(guī)范中增加了對(duì)Proxy的處理,目前來(lái)看這是引擎內(nèi)部處理的,對(duì)現(xiàn)在很多檢測(cè)數(shù)組的方法并不影響。
語(yǔ)言實(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)看一遍,方便對(duì)比。好在W3C中文站有5.1的100%翻譯版本:
ES5中文版: https://www.w3.org/html/ig/zh...
然后可以再看ES6也就是ES2015的標(biāo)準(zhǔn),雖然沒(méi)有中文版,不過(guò)可以參考阮老師的ES6入門(mén),順便也可以瞄一眼ES2016的標(biāo)準(zhǔn):
ES 2015: http://www.ecma-international...
ECMAScript 6入門(mén)教程: http://es6.ruanyifeng.com/
ES 2016: http://www.ecma-international...
期間有任何疑惑可以參考MDN上的JS參考文檔,非常全面,涵蓋了從入門(mén)到精通。
https://developer.mozilla.org...
看完這些再看ES2018就會(huì)非常輕松了:
https://tc39.github.io/ecma262/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/83634.html
摘要:標(biāo)準(zhǔn)對(duì)象,語(yǔ)義由本規(guī)范定義的對(duì)象。這意味著雖然有,本質(zhì)上依然是構(gòu)造函數(shù),并不能像那樣表演多繼承嵌套類(lèi)等高難度動(dòng)作。不過(guò)這里的并不是我們所說(shuō)的數(shù)據(jù)類(lèi)型,而是對(duì)象構(gòu)造函數(shù)。 序 ECMAScript is an object-oriented programming language for performing computations and manipulating computat...
摘要:在寫(xiě)完容器源碼分析系列文章中的最后一篇后,沒(méi)敢懈怠,趁熱打鐵,花了天時(shí)間閱讀了方面的源碼。從今天開(kāi)始,我將對(duì)部分的源碼分析系列文章進(jìn)行更新。全稱(chēng)是,即面向切面的編程,是一種開(kāi)發(fā)理念。在中,切面只是一個(gè)概念,并沒(méi)有一個(gè)具體的接口或類(lèi)與此對(duì)應(yīng)。 1. 簡(jiǎn)介 前一段時(shí)間,我學(xué)習(xí)了 Spring IOC 容器方面的源碼,并寫(xiě)了數(shù)篇文章對(duì)此進(jìn)行講解。在寫(xiě)完 Spring IOC 容器源碼分析系列...
摘要:前端日?qǐng)?bào)精選漫談函數(shù)式編程一十年蹤跡的博客前端每周清單的優(yōu)勢(shì)與劣勢(shì)有望超越在嵌入式及物聯(lián)網(wǎng)的應(yīng)用現(xiàn)狀進(jìn)階系列高階組件詳解一前端之路譯如何充分利用控制臺(tái)掘金程序猿升級(jí)攻略眾成翻譯中文譯如何充分利用控制臺(tái)掘金前端從強(qiáng)制開(kāi)啟壓縮探 2017-06-27 前端日?qǐng)?bào) 精選 漫談 JS 函數(shù)式編程(一) - 十年蹤跡的博客前端每周清單: Vue的優(yōu)勢(shì)與劣勢(shì);Node.js有望超越Java;JS在嵌...
摘要:前端日?qǐng)?bào)精選標(biāo)準(zhǔn)導(dǎo)讀動(dòng)感小前端的專(zhuān)欄大型網(wǎng)站前端使用圖片格式的正確姿勢(shì)騰訊前端大會(huì)現(xiàn)場(chǎng)筆記掘金在中學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法掘金周刊第期中文在中使用混合眾成翻譯已完結(jié)騰訊前端大會(huì)現(xiàn)場(chǎng)記錄掘金翻譯整合鼠標(biāo)觸摸和觸控筆事件的掘金第期 2017-06-25 前端日?qǐng)?bào) 精選 ECMAScript 2018 標(biāo)準(zhǔn)導(dǎo)讀 - 動(dòng)感小前端的專(zhuān)欄 - SegmentFault大型網(wǎng)站前端使用圖片格式的正確姿勢(shì)騰...
摘要:今天同學(xué)去面試,做了兩道面試題全部做錯(cuò)了,發(fā)過(guò)來(lái)給道典型的面試題前端掘金在界中,開(kāi)發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha) - 前端 - 掘金來(lái)自《JavaScript 標(biāo)準(zhǔn)參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡(jiǎn)介 算法實(shí)現(xiàn) 選擇排序 簡(jiǎn)介 算法實(shí)現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經(jīng)典面...
閱讀 1357·2021-11-22 15:25
閱讀 3350·2021-10-21 09:38
閱讀 1563·2021-10-19 13:21
閱讀 992·2021-09-06 15:00
閱讀 1674·2019-08-30 15:44
閱讀 2577·2019-08-29 15:40
閱讀 3432·2019-08-29 13:44
閱讀 2024·2019-08-26 16:56