{"id":18938825,"url":"https://github.com/bigcui/ecma6","last_synced_at":"2026-03-22T07:30:20.457Z","repository":{"id":80178045,"uuid":"50648498","full_name":"bigcui/ecma6","owner":"bigcui","description":null,"archived":false,"fork":false,"pushed_at":"2016-01-24T04:30:06.000Z","size":45,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-12-31T22:11:38.536Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bigcui.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-01-29T08:12:17.000Z","updated_at":"2016-02-11T11:39:08.000Z","dependencies_parsed_at":"2023-03-12T10:18:37.911Z","dependency_job_id":null,"html_url":"https://github.com/bigcui/ecma6","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bigcui%2Fecma6","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bigcui%2Fecma6/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bigcui%2Fecma6/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bigcui%2Fecma6/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bigcui","download_url":"https://codeload.github.com/bigcui/ecma6/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239937701,"owners_count":19721484,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T12:15:34.319Z","updated_at":"2026-03-22T07:30:20.423Z","avatar_url":"https://github.com/bigcui.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## ECMAScript 6简介 ##\n\n1. ECMAScript和JavaScript的关系\n1. ECMAScript的历史\n1. 部署进度\n1. Babel转码器\n1. ECMAScript 7\n\nECMAScript 6（以下简称ES6）是JavaScript语言的下一代标准，已经在2015年6月正式发布了。它的目标，是使得JavaScript语言可以用来编写复杂的大型应用程序，成为企业级开发语言。\n\n标准的制定者有计划，以后每年发布一次标准，使用年份作为标准的版本。因为当前版本的ES6是在2015年发布的，所以又称ECMAScript 2015。也就是说，ES6就是ES2015，下一年应该会发布小幅修订的ES2016。\n\n\n\n## 1.ECMAScript和JavaScript的关系 ##\n\n一个常见的问题是，ECMAScript和JavaScript到底是什么关系？\n\n要讲清楚这个问题，需要回顾历史。1996年11月，JavaScript的创造者Netscape公司，决定将JavaScript提交给国际标准化组织ECMA，希望这种语言能够成为国际标准。次年，ECMA发布262号标准文件（ECMA-262）的第一版，规定了浏览器脚本语言的标准，并将这种语言称为ECMAScript，这个版本就是1.0版。\n\n该标准从一开始就是针对JavaScript语言制定的，但是之所以不叫JavaScript，有两个原因。一是商标，Java是Sun公司的商标，根据授权协议，只有Netscape公司可以合法地使用JavaScript这个名字，且JavaScript本身也已经被Netscape公司注册为商标。二是想体现这门语言的制定者是ECMA，不是Netscape，这样有利于保证这门语言的开放性和中立性。\n\n因此，ECMAScript和JavaScript的关系是，前者是后者的规格，后者是前者的一种实现（另外的ECMAScript方言还有Jscript和ActionScript）。在日常场合，这两个词是可以互换的。\n\n## 2.ECMAScript的历史 ##\nES6从开始制定到最后发布，整整用了15年。\n\n前面提到，ECMAScript 1.0是1997年发布的，接下来的两年，连续发布了ECMAScript 2.0（1998年6月）和ECMAScript 3.0（1999年12月）。3.0版是一个巨大的成功，在业界得到广泛支持，成为通行标准，奠定了JavaScript语言的基本语法，以后的版本完全继承。直到今天，初学者一开始学习JavaScript，其实就是在学3.0版的语法。\n\n2000年，ECMAScript 4.0开始酝酿。这个版本最后没有通过，但是它的大部分内容被ES6继承了。因此，ES6制定的起点其实是2000年。\n\n为什么ES4没有通过呢？因为这个版本太激进了，对ES3做了彻底升级，导致标准委员会的一些成员不愿意接受。ECMA的第39号技术专家委员会（Technical Committee 39，简称TC39）负责制订ECMAScript标准，成员包括Microsoft、Mozilla、Google等大公司。\n\n2007年10月，ECMAScript 4.0版草案发布，本来预计次年8月发布正式版本。但是，各方对于是否通过这个标准，发生了严重分歧。以Yahoo、Microsoft、Google为首的大公司，反对JavaScript的大幅升级，主张小幅改动；以JavaScript创造者Brendan Eich为首的Mozilla公司，则坚持当前的草案。\n\n2008年7月，由于对于下一个版本应该包括哪些功能，各方分歧太大，争论过于激烈，ECMA开会决定，中止ECMAScript 4.0的开发，将其中涉及现有功能改善的一小部分，发布为ECMAScript 3.1，而将其他激进的设想扩大范围，放入以后的版本，由于会议的气氛，该版本的项目代号起名为Harmony（和谐）。会后不久，ECMAScript 3.1就改名为ECMAScript 5。\n\n2009年12月，ECMAScript 5.0版正式发布。Harmony项目则一分为二，一些较为可行的设想定名为JavaScript.next继续开发，后来演变成ECMAScript 6；一些不是很成熟的设想，则被视为JavaScript.next.next，在更远的将来再考虑推出。TC39委员会的总体考虑是，ES5与ES3基本保持兼容，较大的语法修正和新功能加入，将由JavaScript.next完成。当时，JavaScript.next指的是ES6，第六版发布以后，就指ES7。TC39的判断是，ES5会在2013年的年中成为JavaScript开发的主流标准，并在此后五年中一直保持这个位置。\n\n2011年6月，ECMAscript 5.1版发布，并且成为ISO国际标准（ISO/IEC 16262:2011）。\n\n2013年3月，ECMAScript 6草案冻结，不再添加新功能。新的功能设想将被放到ECMAScript 7。\n\n2013年12月，ECMAScript 6草案发布。然后是12个月的讨论期，听取各方反馈。\n\n2015年6月，ECMAScript 6正式通过，成为国际标准。从2000年算起，这时已经过去了15年。\n\n##3.部署进度 ##\n各大浏览器的最新版本，对ES6的支持可以查看kangax.github.io/es5-compat-table/es6/。随着时间的推移，支持度已经越来越高了，ES6的大部分特性都实现了。\n\nNode.js是JavaScript语言的服务器运行环境，对ES6的支持度比浏览器更高。通过Node，可以体验更多ES6的特性。建议使用版本管理工具nvm，来安装Node，因为可以自由切换版本。不过，nvm不支持Windows系统，如果你使用Windows系统，下面的操作可以改用nvmw或nvm-windows代替。\n\n安装nvm需要打开命令行窗口，运行下面的命令。\n\n    $ curl -o https://raw.githubusercontent.com/creationix/nvm/\u003cversion number\u003e/install.sh | bash\n上面命令的version number处，需要用版本号替换。本节写作时的版本号是v0.29.0。该命令运行后，nvm会默认安装在用户主目录的.nvm子目录。\n\n然后，激活nvm。\n    \n    $ source ~/.nvm/nvm.sh\n激活以后，安装Node的最新版。\n\n    $ nvm install node\n安装完成后，切换到该版本。\n\n    $ nvm use node\n使用下面的命令，可以查看Node所有已经实现的ES6特性。\n\n    $ node --v8-options | grep harmony\n    \n      --harmony_typeof\n      --harmony_scoping\n      --harmony_modules\n      --harmony_symbols\n      --harmony_proxies\n      --harmony_collections\n      --harmony_observation\n      --harmony_generators\n      --harmony_iteration\n      --harmony_numeric_literals\n      --harmony_strings\n      --harmony_arrays\n      --harmony_maths\n      --harmony\n上面命令的输出结果，会因为版本的不同而有所不同。\n\n我写了一个ES-Checker模块，用来检查各种运行环境对ES6的支持情况。访问ruanyf.github.io/es-checker，可以看到您的浏览器支持ES6的程度。运行下面的命令，可以查看本机支持ES6的程度。\n    \n    $ npm install -g es-checker\n    $ es-checker\n    \n    =========================================\n    Passes 24 feature Dectations\n    Your runtime supports 57% of ECMAScript 6\n    =========================================\n## 4.Babel转码器 ##\nBabel是一个广泛使用的ES6转码器，可以将ES6代码转为ES5代码，从而在浏览器或其他环境执行。这意味着，你可以用ES6的方式编写程序，又不用担心现有环境是否支持。下面是一个例子。\n\n    // 转码前\n    input.map(item =\u003e item + 1);\n    \n    // 转码后\n    input.map(function (item) {\n      return item + 1;\n    });\n\n上面的原始代码用了箭头函数，这个特性还没有得到广泛支持，Babel将其转为普通函数，就能在现有的JavaScript环境执行了。\n\n### 命令行环境 ###\n命令行下，Babel的安装命令如下。\n\n    $ npm install --global babel-cli\n    $ npm install --save babel-preset-es2015\n\n然后在当前目录下，新建一个配置文件.babelrc。\n\n    // .babelrc\n    {\n      \"presets\": ['es2015']\n    }\n\nBabel自带一个babel-node命令，提供支持ES6的REPL环境。它支持Node的REPL环境的所有功能，而且可以直接运行ES6代码。\n\n    $ babel-node\n    \u003e\n    \u003e console.log([1,2,3].map(x =\u003e x * x))\n    [ 1, 4, 9 ]\n    \u003e\nbabel-node命令也可以直接运行ES6脚本。假定将上面的代码放入脚本文件es6.js。\n\n    $ babel-node es6.js\n    [1, 4, 9]\nbabel命令可以将ES6代码转为ES5代码。\n\n    $ babel es6.js\n    \"use strict\";\n    \n    console.log([1, 2, 3].map(function (x) {\n      return x * x;\n    }));\n-o参数将转换后的代码，从标准输出导入文件。\n\n    $ babel es6.js -o es5.js\n    # 或者\n    $ babel es6.js --out-file es5.js\n-d参数用于转换整个目录。\n\n    $ babel -d build-dir source-dir\n注意，-d参数后面跟的是输出目录。\n\n如果希望生成source map文件，则要加上-s参数。\n\n    $ babel -d build-dir source-dir -s\n### 浏览器环境 ###\nBabel也可以用于浏览器。但是，从Babel 6.0开始，不再直接提供浏览器版本，而是要用构建工具构建出来。如果你没有或不想使用构建工具，只有通过安装5.x版本的babel-core模块获取。\n\n    $ npm install babel-core@5\n运行上面的命令以后，就可以在当前目录的node_modules/babel-core/子目录里面，找到babel的浏览器版本browser.js（未精简）和browser.min.js（已精简）。\n\n然后，将下面的代码插入网页。\n    \n    \u003cscript src=\"node_modules/babel-core/browser.js\"\u003e\u003c/script\u003e\n    \u003cscript type=\"text/babel\"\u003e\n    // Your ES6 code\n    \u003c/script\u003e\n上面代码中，browser.js是Babel提供的转换器脚本，可以在浏览器运行。用户的ES6脚本放在script标签之中，但是要注明type=\"text/babel\"。\n\n这种写法是实时将ES6代码转为ES5，对网页性能会有影响。生产环境需要加载已经转码完成的脚本。\n\n下面是Babel配合Browserify一起使用，可以生成浏览器能够直接加载的脚本。首先，安装babelify模块。\n\n    $ npm install --save-dev babelify babel-preset-es2015\n然后，再用命令行转换ES6脚本。\n\n    $  browserify script.js -o bundle.js \\\n      -t [ babelify --presets [ es2015 react ] ]\n上面代码将ES6脚本script.js，转为bundle.js，浏览器直接加载后者就可以了。\n\n在package.json设置下面的代码，就不用每次命令行都输入参数了。\n\n    {\n      \"browserify\": {\n    \"transform\": [[\"babelify\", { \"presets\": [\"es2015\"] }]]\n      }\n    }\n\n## 5.ECMAScript 7 ##\n2013年3月，ES6的草案封闭，不再接受新功能了。新的功能将被加入ES7。\n\n任何人都可以向TC39提案，从提案到变成正式标准，需要经历五个阶段。每个阶段的变动都需要由TC39委员会批准。\n\n- Stage 0 Strawman（展示阶段）\n- Stage 1 Proposal（征求意见阶段）\n- Stage 2 Draft（草案阶段）\n- Stage 3 Candidate（候选人阶段）\n- Stage 4 Finished（定案阶段）\n一个提案只要能进入Stage 2，就差不多等于肯定会包括在ES7里面。\n\n本书的写作目标之一，是跟踪ECMAScript语言的最新进展。对于那些明确的、或者很有希望列入ES7的功能，尤其是那些Babel已经支持的功能，都将予以介绍。\n\n本书介绍的ES7功能清单如下。\n\n1. Stage 0：\n\n\tes7.comprehensions：数组推导\n\tes7.classProperties：类的属性\n\tes7.functionBind：函数的绑定运算符\n\n1. Stage 1：\n\t\n\tes7.decorators：修饰器\n\tes7.exportExtensions：export的扩展写法\n\tes7.trailingFunctionCommas：函数参数的尾逗号\n\n1. Stage 2：\n\t\n\tes7.exponentiationOperator：指数运算符\n\tes7.asyncFunctions：async函数\n\tes7.objectRestSpread：对象的Rest参数和扩展运算符\n\nECMAScript当前的所有提案，可以在TC39的官方网站Github.com/tc39/ecma262查看。\n\nBabel转码器可以通过安装和使用插件来使用各个stage的语法。\n\n## 6.ECMAScript 教程目录 ##\n\n###语法糖篇\n1. let、block、const\n1. varable、variable_array、variable_other、variable_application\n1. extend-other、extend-fun1、extend-fun2、extend-obj\n1. symbol\n1. set、map\n1. Iterator、for of\n1. class\n1. module、export\n1. style（参见网站）\n\n###异步编程篇\n1. Promise\n1. Fetch\n1. Async\n\n----------\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbigcui%2Fecma6","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbigcui%2Fecma6","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbigcui%2Fecma6/lists"}