es6文法是2015年6月發布的。 es6是2015年6月正式發表的JavaScript語言的標準,其正式名為ECMAScript2015(ES2015),它是ECMAScript的第6個版本。 es6的目標是使得JavaScript語言可以用來編寫複雜的大型應用程序,成為企業級開發語言。
本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。
es6簡介
es6全名為ECMAScript6(ECMAScript的第6個版本),是於2015年6月正式發布的JavaScript語言的標準,正式名為ECMAScript 2015(ES2015)。它的目標是使得JavaScript語言可以用來編寫複雜的大型應用程序,成為企業級開發語言。
ECMAScript 6 目前基本上成為業界標準,它的普及速度比ES5 要快很多,主要原因是現代瀏覽器對ES6 的支援相當迅速,尤其是Chrome 和Firefox 瀏覽器,已經支援ES6 中絕大多數的特性。
ECMAScript 是根據ECMA-262 標準實現的通用腳本語言,ECMA-262 標準主要規定了這門語言的語法、類型、語句、關鍵字、保留字、操作符、物件等幾個部分,目前ECMAScript 的最新版是ECMAScript6(簡稱「ES6」)。
每次看到 ES 後面跟著數字,是 ECMAScript 的不同版本。
ECMAScript6是ECMAScript的第6個版本,因此可簡稱為es6。
ECMAScript 6發展歷史
#2000年,ECMAScript 4.0開始醞釀。這個版本最後沒有通過,但是它的大部分內容都被ECMAScript6繼承了。因此,ECMAScript6制定的起點其實是2000年。
2007年10月,ECMAScript 4.0草案發布,原本預計2008年8月發布正式版本。但是,各方對於是否通過這個標準,發生了嚴重分歧。以Yahoo、Microsoft、Google為首的大公司,反對JavaScript的大幅升級,主張小幅改動;以JavaScript創造者Brendan Eich為首的Mozilla公司,則堅持當前的草案。
2008年7月,由於對於下一個版本應該包括哪些功能,各方分歧太大,爭論過於激烈,ECMA開會決定,中止ECMAScript 4.0的開發,將其中涉及現有功能改善的一小部分,發佈為ECMAScript 3.1,而將其他激進的設想擴大範圍,放入以後的版本,由於會議的氣氛,該版本的專案代號起名為Harmony(和諧)。會後不久,ECMAScript 3.1改名為ECMAScript 5。
2009年12月,ECMAScript 5.0正式發表。 Harmony專案則一分為二,一些較為可行的設想定名為JavaScript.next繼續開發,後來演變成ECMAScript 6;有些不是很成熟的設想,則被視為JavaScript.next.next,在更遠的將來再考慮推出。
2011年,ECMAScript 5.1發布後開始6.0版的製定。
2013年3月,ECMAScript 6草稿凍結,不再增加新功能。新的功能設想將被放到ECMAScript 7。
2013年12月,ECMAScript 6草稿發布。然後是12個月的討論期,聽取各方回饋。由於這個版本引入的語法功能太多,而且制定過程當中,還有很多組織和個人不斷提交新功能。標準委員會最終決定,標準在每年的6月正式發布一次,作為當年的正式版本。接下來的時間,就在這個版本的基礎上做改動,直到下一年的6月份,草案就自然變成了新一年的版本。
2015年6月,ECMAScript 6(ES6)正式通過,成為國際標準,正式名稱為「ECMAScript 2015」(簡稱ES2015)。
ES6 的第一個版本,就這樣在2015年6月發布了,正式名稱就是《ECMAScript 2015標準》(簡稱 ES2015)。 2016年6月,小幅修訂的《ECMAScript 2016標準》(簡稱ES2016)如期發布,這個版本可以看作是ES6.1 版,因為兩者的差異非常小(只新增了數組實例的includes方法和指數運算符),基本上是同一個標準。
因此,ES6 既是歷史名詞,也是一個泛指,意義是5.1版以後的JavaScript 的下一代標準,涵蓋了ES2015、ES2016、ES2017等等,而ES2015 則是正式名稱,特指該年發布的正式版本的語言標準。本書提到 ES6 的地方,一般是指 ES2015 標準,但有時也是泛指「下一代 JavaScript 語言」。
ES6語法規格
探討如何將ES6 的新語法,運用到編碼實踐之中,與傳統的JavaScript 語法結合在一起,寫出合理的、易於閱讀和維護的程式碼。
區塊級作用域
(1)let 取代var
ES6 提出了兩個新的宣告變數的指令:let
和const
。其中,let
完全可以取代var
,因為兩者語意相同,而且let
沒有副作用。
'use strict'; if (true) { let x = 'hello'; } for (let i = 0; i < 10; i++) { console.log(i); }
上面程式碼如果用var
取代let
,實際上就宣告了兩個全域變量,這顯然不是本意。變數應該只在其宣告的程式碼區塊內有效,var
指令做不到這一點。
var
指令存在變數提升效用,let
指令沒有這個問題。
'use strict'; if (true) { console.log(x); // ReferenceError let x = 'hello'; }
上面程式碼如果使用var
取代let
,console.log
那一行就不會報錯,而是會輸出 undefined
,因為變數宣告提升到程式碼區塊的頭部。這違反了變數先宣告後使用的原則。
所以,建議不再使用var
指令,而是使用let
指令取代。
(2)全域常數和執行緒安全性
在let
和const
之間,建議優先使用const
,尤其是在全域環境,不應該設定變量,只應設定常數。
const
優於let
有幾個原因。一個是const
可以提醒閱讀程式的人,這個變數不應該改變;另一個是const
比較符合函數式程式設計思想,運算不改變值,只是新建值,而且這樣也有利於將來的分散式運算;最後一個原因是JavaScript 編譯器會對const
進行最佳化,所以多使用const
,有利於提高程式的運作效率,也就是說let
和const
的本質區別,其實是編譯器內部的處理不同。
// bad var a = 1, b = 2, c = 3; // good const a = 1; const b = 2; const c = 3; // best const [a, b, c] = [1, 2, 3];
const
宣告常數還有兩個好處,一是閱讀程式碼的人立刻會意識到不應該修改這個值,二是防止了無意間修改變數值所導致的錯誤。
所有的函數都應該設定為常數。
長遠來看,JavaScript 可能會有多執行緒的實作(例如Intel 公司的River Trail 那一類的專案),這時let
表示的變量,只應出現在單在執行緒運行的程式碼中,不能是多執行緒共享的,這樣有利於確保執行緒安全。
字串
靜態字串一律使用單引號或反引號,不使用雙引號。動態字串使用反引號。
// bad const a = "foobar"; const b = 'foo' + a + 'bar'; // acceptable const c = `foobar`; // good const a = 'foobar'; const b = `foo${a}bar`;
解構賦值
使用陣列成員對變數賦值時,優先使用解構賦值。
const arr = [1, 2, 3, 4]; // bad const first = arr[0]; const second = arr[1]; // good const [first, second] = arr;
函數的參數如果是物件的成員,優先使用解構賦值。
// bad function getFullName(user) { const firstName = user.firstName; const lastName = user.lastName; } // good function getFullName(obj) { const { firstName, lastName } = obj; } // best function getFullName({ firstName, lastName }) { }
如果函數傳回多個值,優先使用物件的解構賦值,而不是陣列的解構賦值。這樣方便以後加回傳值,以及更改回傳值的順序。
// bad function processInput(input) { return [left, right, top, bottom]; } // good function processInput(input) { return { left, right, top, bottom }; } const { left, right } = processInput(input);
物件
單行定義的對象,最後一個成員不以逗號結尾。多行定義的對象,最後一個成員以逗號結尾。
// bad const a = { k1: v1, k2: v2, }; const b = { k1: v1, k2: v2 }; // good const a = { k1: v1, k2: v2 }; const b = { k1: v1, k2: v2, };
物件盡量靜態化,一旦定義,就不得隨意新增新的屬性。如果新增屬性不可避免,請使用Object.assign
方法。
// bad const a = {}; a.x = 3; // if reshape unavoidable const a = {}; Object.assign(a, { x: 3 }); // good const a = { x: null }; a.x = 3;
如果物件的屬性名稱是動態的,可以在創造物件的時候,使用屬性表達式定義。
// bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey('enabled')] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey('enabled')]: true, };
上面程式碼中,物件obj
的最後一個屬性名,需要計算得到。這時最好採用屬性表達式,在新建obj
的時候,將該屬性與其他屬性定義在一起。這樣一來,所有屬性就在一個地方定義了。
另外,物件的屬性和方法,盡量採用簡潔表達法,這樣容易描述和書寫。
var ref = 'some value'; // bad const atom = { ref: ref, value: 1, addValue: function (value) { return atom.value + value; }, }; // good const atom = { ref, value: 1, addValue(value) { return atom.value + value; }, };
陣列
使用擴充運算子(...)拷貝陣列。
// bad const len = items.length; const itemsCopy = []; let i; for (i = 0; i < len; i++) { itemsCopy[i] = items[i]; } // good const itemsCopy = [...items];
使用 Array.from 方法,將類似陣列的物件轉換為陣列。
const foo = document.querySelectorAll('.foo'); const nodes = Array.from(foo);
函數
立即執行函數可以寫成箭頭函數的形式。
(() => { console.log('Welcome to the Internet.'); })();
那些使用匿名函數當作參數的場合,盡量用箭頭函數代替。因為這樣比較簡潔,而且綁定了 this。
// bad [1, 2, 3].map(function (x) { return x * x; }); // good [1, 2, 3].map((x) => { return x * x; }); // best [1, 2, 3].map(x => x * x);
箭頭函數取代Function.prototype.bind
,不應再用 self/_this/that 綁定 this。
// bad const self = this; const boundMethod = function(...params) { return method.apply(self, params); } // acceptable const boundMethod = method.bind(this); // best const boundMethod = (...params) => method.apply(this, params);
簡單的、單行的、不會重複使用的函數,建議採用箭頭函數。如果函數體較為複雜,則行數較多,還是應採用傳統的函數寫法。
所有配置項目都應該集中在一個對象,放在最後一個參數,布林值不可以直接作為參數。
// bad function divide(a, b, option = false ) { } // good function divide(a, b, { option = false } = {}) { }
不要在函數體內使用 arguments 變量,使用 rest 運算子(...)取代。因為 rest 運算子明確表示你想要取得參數,而且 arguments 是一個類似陣列的對象,而 rest 運算子可以提供一個真正的陣列。
// bad function concatenateAll() { const args = Array.prototype.slice.call(arguments); return args.join(''); } // good function concatenateAll(...args) { return args.join(''); }
使用預設值語法設定函數參數的預設值。
// bad function handleThings(opts) { opts = opts || {}; } // good function handleThings(opts = {}) { // ... }
Map 結構
注意區分 Object 和 Map,只有當模擬現實世界的實體物件時,才會使用 Object。如果只是需要key: value
的資料結構,使用 Map 結構。因為 Map 有內建的遍歷機制。
let map = new Map(arr); for (let key of map.keys()) { console.log(key); } for (let value of map.values()) { console.log(value); } for (let item of map.entries()) { console.log(item[0], item[1]); }
Class
总是用 Class,取代需要 prototype 的操作。因为 Class 的写法更简洁,更易于理解。
// bad function Queue(contents = []) { this._queue = [...contents]; } Queue.prototype.pop = function() { const value = this._queue[0]; this._queue.splice(0, 1); return value; } // good class Queue { constructor(contents = []) { this._queue = [...contents]; } pop() { const value = this._queue[0]; this._queue.splice(0, 1); return value; } }
使用extends
实现继承,因为这样更简单,不会有破坏instanceof
运算的危险。
// bad const inherits = require('inherits'); function PeekableQueue(contents) { Queue.apply(this, contents); } inherits(PeekableQueue, Queue); PeekableQueue.prototype.peek = function() { return this._queue[0]; } // good class PeekableQueue extends Queue { peek() { return this._queue[0]; } }
模块
首先,Module 语法是 JavaScript 模块的标准写法,坚持使用这种写法。使用import
取代require
。
// bad const moduleA = require('moduleA'); const func1 = moduleA.func1; const func2 = moduleA.func2; // good import { func1, func2 } from 'moduleA';
使用export
取代module.exports
。
// commonJS的写法 var React = require('react'); var Breadcrumbs = React.createClass({ render() { return <nav />; } }); module.exports = Breadcrumbs; // ES6的写法 import React from 'react'; class Breadcrumbs extends React.Component { render() { return <nav />; } }; export default Breadcrumbs;
如果模块只有一个输出值,就使用export default
,如果模块有多个输出值,就不使用export default
,export default
与普通的export
不要同时使用。
不要在模块输入中使用通配符。因为这样可以确保你的模块之中,有一个默认输出(export default)。
// bad import * as myObject from './importModule'; // good import myObject from './importModule';
如果模块默认输出一个函数,函数名的首字母应该小写。
function makeStyleGuide() { } export default makeStyleGuide;
如果模块默认输出一个对象,对象名的首字母应该大写。
const StyleGuide = { es6: { } }; export default StyleGuide;
ESLint 的使用
ESLint 是一个语法规则和代码风格的检查工具,可以用来保证写出语法正确、风格统一的代码。
首先,在项目的根目录安装 ESLint。
$ npm install --save-dev eslint
然后,安装 Airbnb 语法规则,以及 import、a11y、react 插件。
$ npm install --save-dev eslint-config-airbnb $ npm install --save-dev eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react
最后,在项目的根目录下新建一个.eslintrc
文件,配置 ESLint。
{ "extends": "eslint-config-airbnb" }
现在就可以检查,当前项目的代码是否符合预设的规则。
index.js
文件的代码如下。
var unused = 'I have no purpose!'; function greet() { var message = 'Hello, World!'; console.log(message); } greet();
使用 ESLint 检查这个文件,就会报出错误。
$ npx eslint index.js index.js 1:1 error Unexpected var, use let or const instead no-var 1:5 error unused is defined but never used no-unused-vars 4:5 error Expected indentation of 2 characters but found 4 indent 4:5 error Unexpected var, use let or const instead no-var 5:5 error Expected indentation of 2 characters but found 4 indent ✖ 5 problems (5 errors, 0 warnings)
上面代码说明,原文件有五个错误,其中两个是不应该使用var
命令,而要使用let
或const
;一个是定义了变量,却没有使用;另外两个是行首缩进为 4 个空格,而不是规定的 2 个空格。
【相关推荐:javascript视频教程、编程视频】
以上是es6語法是什麼時候發佈的的詳細內容。更多資訊請關注PHP中文網其他相關文章!

在es6中,可以利用“Array.isArray()”方法判断对象是否为数组,若判断的对象是数组,返回的结果是true,若判断对象不是数组,返回的结果是false,语法为“Array.isArray(需要检测的js对象)”。

es6中遍历跟迭代的区别是:遍历强调的是要把整个数据依次全部取出来,是访问数据结构的所有元素;而迭代虽然也是依次取出数据,但是并不保证取多少,也不保证把所有的数据取完,是遍历的一种形式。

在es6中,可用Object对象的is()方法来判断两个对象是否相等,该方法检测两个变量的值是否为同一个值,判断两个对象的引用地址是否一致,语法“Object.is(对象1,对象2)”;该方法会返回布尔值,若返回true则表示两个对象相等。

转换方法:1、利用“+”给数字拼接一个空字符,语法“数字+""”;2、使用String(),可把对象的值转换为字符串,语法“String(数字对象)”;3、用toString(),可返回数字的字符串表示,语法“数字.toString()”。

sort排序是es6中的;sort排序是es6中用于对数组的元素进行排序的方法,该方法默认不传参,按照字符编码顺序进行排序,排序顺序可以是字母或数字,并按升序或降序,语法为“array.sort(callback(a,b))”。

在es6中,assign用于对象的合并,可以将源对象的所有可枚举属性复制到目标对象;若目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性,语法为“Object.assign(...)”

改变方法:1、利用splice()方法修改,该方法可以直接修改原数组的内容,语法为“数组.splice(开始位置,修改个数,修改后的值)”;2、利用下标访问数组元素,并重新赋值来修改数组数据,语法为“数组[下标值]=修改后的值;”。

在es6中,import as用于将若干export导出的内容组合成一个对象返回;ES6的模块化分为导出与导入两个模块,该方法能够将所有的导出内容包裹到指定对象中,语法为“import * as 对象 from ...”。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具