ECMAScript 6 入門教程

2021-02-15 web前端開發

作者 | 阮一峰

一、前言

《ECMAScript 6 入門》是一本開源的 JavaScript 語言教程,全面介紹 ECMAScript 6 新引入的語法特性。

本書覆蓋 ES6 與上一個版本 ES5 的所有不同之處,對涉及的語法知識給予詳細介紹,並給出大量簡潔易懂的示例代碼。

本書為中級難度,適合已經掌握 ES5 的讀者,用來了解這門語言的最新發展;也可當作參考手冊,查尋新增的語法點。如果你是 JavaScript 語言的初學者,建議先學完《JavaScript 語言入門教程》。這本書裡的相關文章可以在公眾號的【編程教程】菜單裡進行查看《JavaScript 入門教程》。

全書已由電子工業出版社出版,2017年9月推出了第三版,書名為《ES6 標準入門》。紙版是基於網站內容排版印刷的。

感謝張春雨編輯支持我將全書開源的做法。如果您認可這本書,建議購買紙版。這樣可以使出版社不因出版開源書籍而虧錢,進而鼓勵更多的作者開源自己的書籍。下面是第三版的購買地址。

二、ECMAScript 6 簡介

ECMAScript 6.0(以下簡稱 ES6)是 JavaScript 語言的下一代標準,已經在 2015 年 6 月正式發布了。它的目標,是使得 JavaScript 語言可以用來編寫複雜的大型應用程式,成為企業級開發語言。

01、ECMAScript 和 JavaScript 的關係

一個常見的問題是,ECMAScript 和 JavaScript 到底是什麼關係?

要講清楚這個問題,需要回顧歷史。1996 年 11 月,JavaScript 的創造者 Netscape 公司,決定將 JavaScript 提交給標準化組織 ECMA,希望這種語言能夠成為國際標準。次年,ECMA 發布 262 號標準文件(ECMA-262)的第一版,規定了瀏覽器腳本語言的標準,並將這種語言稱為 ECMAScript,這個版本就是 1.0 版。

該標準從一開始就是針對 JavaScript 語言制定的,但是之所以不叫 JavaScript,有兩個原因。一是商標,Java 是 Sun 公司的商標,根據授權協議,只有 Netscape 公司可以合法地使用 JavaScript 這個名字,且 JavaScript 本身也已經被 Netscape 公司註冊為商標。二是想體現這門語言的制定者是 ECMA,不是 Netscape,這樣有利於保證這門語言的開放性和中立性。

因此,ECMAScript 和 JavaScript 的關係是,前者是後者的規格,後者是前者的一種實現(另外的 ECMAScript 方言還有 JScript 和 ActionScript)。日常場合,這兩個詞是可以互換的。

02、ES6 與 ECMAScript 2015 的關係

ECMAScript 2015(簡稱 ES2015)這個詞,也是經常可以看到的。它與 ES6 是什麼關係呢?

2011 年,ECMAScript 5.1 版發布後,就開始制定 6.0 版了。因此,ES6 這個詞的原意,就是指 JavaScript 語言的下一個版本。

但是,因為這個版本引入的語法功能太多,而且制定過程當中,還有很多組織和個人不斷提交新功能。事情很快就變得清楚了,不可能在一個版本裡面包括所有將要引入的功能。常規的做法是先發布 6.0 版,過一段時間再發 6.1 版,然後是 6.2 版、6.3 版等等。

但是,標準的制定者不想這樣做。他們想讓標準的升級成為常規流程:任何人在任何時候,都可以向標準委員會提交新語法的提案,然後標準委員會每個月開一次會,評估這些提案是否可以接受,需要哪些改進。如果經過多次會議以後,一個提案足夠成熟了,就可以正式進入標準了。這就是說,標準的版本升級成為了一個不斷滾動的流程,每個月都會有變動。

標準委員會最終決定,標準在每年的 6 月份正式發布一次,作為當年的正式版本。接下來的時間,就在這個版本的基礎上做改動,直到下一年的 6 月份,草案就自然變成了新一年的版本。這樣一來,就不需要以前的版本號了,只要用年份標記就可以了。

ES6 的第一個版本,就這樣在 2015 年 6 月發布了,正式名稱就是《ECMAScript 2015 標準》(簡稱 ES2015)。2016 年 6 月,小幅修訂的《ECMAScript 2016 標準》(簡稱 ES2016)如期發布,這個版本可以看作是 ES6.1 版,因為兩者的差異非常小(只新增了數組實例的includes方法和指數運算符),基本上是同一個標準。根據計劃,2017 年 6 月發布 ES2017 標準。

因此,ES6 既是一個歷史名詞,也是一個泛指,含義是 5.1 版以後的 JavaScript 的下一代標準,涵蓋了 ES2015、ES2016、ES2017 等等,而 ES2015 則是正式名稱,特指該年發布的正式版本的語言標準。本書中提到 ES6 的地方,一般是指 ES2015 標準,但有時也是泛指「下一代 JavaScript 語言」。

03、語法提案的批准流程

任何人都可以向標準委員會(又稱 TC39 委員會)提案,要求修改語言標準。

一種新的語法從提案到變成正式標準,需要經歷五個階段。每個階段的變動都需要由 TC39 委員會批准。

一個提案只要能進入 Stage 2,就差不多肯定會包括在以後的正式標準裡面。ECMAScript 當前的所有提案,可以在 TC39 的官方網站GitHub.com/tc39/ecma262查看。

本書的寫作目標之一,是跟蹤 ECMAScript 語言的最新進展,介紹 5.1 版本以後所有的新語法。對於那些明確或很有希望,將要列入標準的新語法,都將予以介紹。

04、ECMAScript 的歷史

ES6 從開始制定到最後發布,整整用了 15 年。

前面提到,ECMAScript 1.0 是 1997 年發布的,接下來的兩年,連續發布了 ECMAScript 2.0(1998 年 6 月)和 ECMAScript 3.0(1999 年 12 月)。3.0 版是一個巨大的成功,在業界得到廣泛支持,成為通行標準,奠定了 JavaScript 語言的基本語法,以後的版本完全繼承。直到今天,初學者一開始學習 JavaScript,其實就是在學 3.0 版的語法。

2000 年,ECMAScript 4.0 開始醞釀。這個版本最後沒有通過,但是它的大部分內容被 ES6 繼承了。因此,ES6 制定的起點其實是 2000 年。

為什麼 ES4 沒有通過呢?因為這個版本太激進了,對 ES3 做了徹底升級,導致標準委員會的一些成員不願意接受。ECMA 的第 39 號技術專家委員會(Technical Committee 39,簡稱 TC39)負責制訂 ECMAScript 標準,成員包括 Microsoft、Mozilla、Google 等大公司。

2007 年 10 月,ECMAScript 4.0 版草案發布,本來預計次年 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,在更遠的將來再考慮推出。TC39 委員會的總體考慮是,ES5 與 ES3 基本保持兼容,較大的語法修正和新功能加入,將由 JavaScript.next 完成。當時,JavaScript.next 指的是 ES6,第六版發布以後,就指 ES7。TC39 的判斷是,ES5 會在 2013 年的年中成為 JavaScript 開發的主流標準,並在此後五年中一直保持這個位置。

2011 年 6 月,ECMAScript 5.1 版發布,並且成為 ISO 國際標準(ISO/IEC 16262:2011)。

2013 年 3 月,ECMAScript 6 草案凍結,不再添加新功能。新的功能設想將被放到 ECMAScript 7。

2013 年 12 月,ECMAScript 6 草案發布。然後是 12 個月的討論期,聽取各方反饋。

2015 年 6 月,ECMAScript 6 正式通過,成為國際標準。從 2000 年算起,這時已經過去了 15 年。

05、部署進度

各大瀏覽器的最新版本,對 ES6 的支持可以查看kangax.github.io/compat-table/es6/。隨著時間的推移,支持度已經越來越高了,超過 90%的 ES6 語法特性都實現了。

Node 是 JavaScript 的伺服器運行環境(runtime)。它對 ES6 的支持度更高。除了那些默認打開的功能,還有一些語法功能已經實現了,但是默認沒有打開。使用下面的命令,可以查看 Node 已經實現的 ES6 特性。

// Linux & Mac
$ node --v8-options | grep harmony
// Windows
$ node --v8-options | findstr harmony

我寫了一個工具 ES-Checker,用來檢查各種運行環境對 ES6 的支持情況。訪問ruanyf.github.io/es-checker,可以看到您的瀏覽器支持 ES6 的程度。運行下面的命令,可以查看你正在使用的 Node 環境對 ES6 的支持程度。

$ npm install -g es-checker
$ es-checker
=========================================
Passes 24 feature Detections
Your runtime supports 57% of ECMAScript 6
=========================================


06、Babel 轉碼器

Babel 是一個廣泛使用的 ES6 轉碼器,可以將 ES6 代碼轉為 ES5 代碼,從而在現有環境執行。這意味著,你可以用 ES6 的方式編寫程序,又不用擔心現有環境是否支持。下面是一個例子。

// 轉碼前
input.map(item => item + 1);
// 轉碼後
input.map(function (item) {
return item + 1;
});

上面的原始代碼用了箭頭函數,Babel 將其轉為普通函數,就能在不支持箭頭函數的 JavaScript 環境執行了。

下面的命令在項目目錄中,安裝 Babel。

$ npm install --save-dev @babel/core

配置文件.babelrc

Babel 的配置文件是.babelrc,存放在項目的根目錄下。使用 Babel 的第一步,就是配置這個文件。

該文件用來設置轉碼規則和插件,基本格式如下。

{
"presets": [],
"plugins": []
}

presets欄位設定轉碼規則,官方提供以下的規則集,你可以根據需要安裝。

# 最新轉碼規則
$ npm install --save-dev @babel/preset-env
# react 轉碼規則
$ npm install --save-dev @babel/preset-react

然後,將這些規則加入.babelrc。

{
"presets": [
"@babel/env",
"@babel/preset-react"
],
"plugins": []
}

注意,以下所有 Babel 工具和模塊的使用,都必須先寫好.babelrc。

命令行轉碼

Babel 提供命令行工具@babel/cli,用於命令行轉碼。

它的安裝命令如下。

$ npm install --save-dev @babel/cli

基本用法如下。

# 轉碼結果輸出到標準輸出
$ npx babel example.js
# 轉碼結果寫入一個文件
# --out-file 或 -o 參數指定輸出文件
$ npx babel example.js --out-file compiled.js
# 或者
$ npx babel example.js -o compiled.js
# 整個目錄轉碼
# --out-dir 或 -d 參數指定輸出目錄
$ npx babel src --out-dir lib
# 或者
$ npx babel src -d lib
# -s 參數生成source map文件
$ npx babel src -d lib -s

babel-node

@babel/node模塊的babel-node命令,提供一個支持 ES6 的 REPL 環境。它支持 Node 的 REPL 環境的所有功能,而且可以直接運行 ES6 代碼。

首先,安裝這個模塊。

$ npm install --save-dev @babel/node

然後,執行babel-node就進入 REPL 環境。

$ npx babel-node
> (x => x * 2)(1)
2

babel-node命令可以直接運行 ES6 腳本。將上面的代碼放入腳本文件es6.js,然後直接運行。

# es6.js 的代碼
# console.log((x => x * 2)(1));
$ npx babel-node es6.js
2

@babel/register 模塊

@babel/register模塊改寫require命令,為它加上一個鉤子。此後,每當使用require加載.js、.jsx、.es和.es6後綴名的文件,就會先用 Babel 進行轉碼。

$ npm install --save-dev @babel/register

使用時,必須首先加載@babel/register。

// index.js
require('@babel/register');
require('./es6.js');

然後,就不需要手動對index.js轉碼了。

$ node index.js
2

需要注意的是,@babel/register只會對require命令加載的文件轉碼,而不會對當前文件轉碼。另外,由於它是實時轉碼,所以只適合在開發環境使用。

babel API

如果某些代碼需要調用 Babel 的 API 進行轉碼,就要使用@babel/core模塊。

var babel = require('@babel/core');
// 字符串轉碼
babel.transform('code();', options);babel.transformFile('filename.js', options, function(err, result) {
result;});
// 文件轉碼(同步)
babel.transformFileSync('filename.js', options);babel.transformFromAst(ast, code, options);

配置對象options,可以參看官方文檔http://babeljs.io/docs/usage/options/。

下面是一個例子。

var es6Code = 'let x = n => n + 1';
var es5Code = require('@babel/core')
.transform(es6Code, {
presets: ['@babel/env']
})
.code;
console.log(es5Code);

上面代碼中,transform方法的第一個參數是一個字符串,表示需要被轉換的 ES6 代碼,第二個參數是轉換的配置對象。

@babel/polyfill

Babel 默認只轉換新的 JavaScript 句法(syntax),而不轉換新的 API,比如Iterator、Generator、Set、Map、Proxy、Reflect、Symbol、Promise等全局對象,以及一些定義在全局對象上的方法(比如Object.assign)都不會轉碼。

舉例來說,ES6 在Array對象上新增了Array.from方法。Babel 就不會轉碼這個方法。如果想讓這個方法運行,必須使用babel-polyfill,為當前環境提供一個墊片。

安裝命令如下。

$ npm install --save-dev @babel/polyfill

然後,在腳本頭部,加入如下一行代碼。

import '@babel/polyfill';require('@babel/polyfill');

Babel 默認不轉碼的 API 非常多,詳細清單可以查看babel-plugin-transform-runtime模塊的definitions.js文件。

瀏覽器環境

Babel 也可以用於瀏覽器環境,使用@babel/standalone模塊提供的瀏覽器版本,將其插入網頁。

<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// Your ES6 code
</script>

注意,網頁實時將 ES6 代碼轉為 ES5,對性能會有影響。生產環境需要加載已經轉碼完成的腳本。

Babel 提供一個REPL 在線編譯器,可以在線將 ES6 代碼轉為 ES5 代碼。轉換後的代碼,可以直接作為 ES5 代碼插入網頁運行。

07、Traceur 轉碼器

Google 公司的Traceur轉碼器,也可以將 ES6 代碼轉為 ES5 代碼。

直接插入網頁

Traceur 允許將 ES6 代碼直接插入網頁。首先,必須在網頁頭部加載 Traceur 庫文件。

<script src="https://google.github.io/traceur-compiler/bin/traceur.js"></script>
<script src="https://google.github.io/traceur-compiler/bin/BrowserSystem.js"></script>
<script src="https://google.github.io/traceur-compiler/src/bootstrap.js"></script>
<script type="module">
import './Greeter.js';
</script>

上面代碼中,一共有 4 個script標籤。第一個是加載 Traceur 的庫文件,第二個和第三個是將這個庫文件用於瀏覽器環境,第四個則是加載用戶腳本,這個腳本裡面可以使用 ES6 代碼。

注意,第四個script標籤的type屬性的值是module,而不是text/javascript。這是 Traceur 編譯器識別 ES6 代碼的標誌,編譯器會自動將所有type=module的代碼編譯為 ES5,然後再交給瀏覽器執行。

除了引用外部 ES6 腳本,也可以直接在網頁中放置 ES6 代碼。

<script type="module">
class Calc {
constructor() {
console.log('Calc constructor');
}
add(a, b) {
return a + b;
}
}
var c = new Calc();
console.log(c.add(4,5));
</script>

正常情況下,上面代碼會在控制臺列印出9。

如果想對 Traceur 的行為有精確控制,可以採用下面參數配置的寫法。

<script>
// Create the System object
window.System = new traceur.runtime.BrowserTraceurLoader();
// Set some experimental options
var metadata = {
traceurOptions: {
experimental: true,
properTailCalls: true,
symbols: true,
arrayComprehension: true,
asyncFunctions: true,
asyncGenerators: exponentiation,
forOn: true,
generatorComprehension: true
}
};
// Load your module
System.import('./myModule.js', {metadata: metadata}).catch(function(ex) {
console.error('Import failed', ex.stack || ex);
});
</script>

上面代碼中,首先生成 Traceur 的全局對象window.System,然後System.import方法可以用來加載 ES6。加載的時候,需要傳入一個配置對象metadata,該對象的traceurOptions屬性可以配置支持 ES6 功能。如果設為experimental: true,就表示除了 ES6 以外,還支持一些實驗性的新功能。

在線轉換

Traceur 也提供一個在線編譯器,可以在線將 ES6 代碼轉為 ES5 代碼。轉換後的代碼,可以直接作為 ES5 代碼插入網頁運行。

上面的例子轉為 ES5 代碼運行,就是下面這個樣子。

<script src="https://google.github.io/traceur-compiler/bin/traceur.js"></script>
<script src="https://google.github.io/traceur-compiler/bin/BrowserSystem.js"></script>
<script src="https://google.github.io/traceur-compiler/src/bootstrap.js"></script>
<script>
$traceurRuntime.ModuleStore.getAnonymousModule(function() {
"use strict";
var Calc = function Calc() {
console.log('Calc constructor');
};
($traceurRuntime.createClass)(Calc, {add: function(a, b) {
return a + b;
}}, {});
var c = new Calc();
console.log(c.add(4, 5));
return {};
});
</script>

命令行轉換

作為命令行工具使用時,Traceur 是一個 Node 的模塊,首先需要用 npm 安裝。

$ npm install -g traceur

安裝成功後,就可以在命令行下使用 Traceur 了。

Traceur 直接運行 ES6 腳本文件,會在標準輸出顯示運行結果,以前面的calc.js為例。

$ traceur calc.js
Calc constructor
9

如果要將 ES6 腳本轉為 ES5 保存,要採用下面的寫法。

$ traceur --script calc.es6.js --out calc.es5.js

上面代碼的--script選項表示指定輸入文件,--out選項表示指定輸出文件。

為了防止有些特性編譯不成功,最好加上--experimental選項。

$ traceur --script calc.es6.js --out calc.es5.js --experimental

命令行下轉換生成的文件,就可以直接放到瀏覽器中運行。

Node 環境的用法

Traceur 的 Node 用法如下(假定已安裝traceur模塊)。

var traceur = require('traceur');
var fs = require('fs');
// 將 ES6 腳本轉為字符串
var contents = fs.readFileSync('es6-file.js').toString();
var result = traceur.compile(contents, {
filename: 'es6-file.js',
sourceMap: true,
// 其他設置
modules: 'commonjs'
});
if (result.error)
throw result.error;
// result 對象的 js 屬性就是轉換後的 ES5 代碼
fs.writeFileSync('out.js', result.js);fs.writeFileSync('out.js.map', result.sourceMap);

相關焦點

  • Mathematica數學入門教程【6】 - 幾何圖形
  • TypeScript 中文入門教程
    轉載:《TypeScript 中文入門教程》 17、註解 (2015-12-03 11:36)轉載:《TypeScript 中文入門教程》 16、Symbols (2015-12-03 11:35)轉載:《TypeScript 中文入門教程》 15、可迭代性 (2015-12-03 11:33)轉載:《TypeScript 中文入門教程》 14
  • 【教程】html+css零基礎入門教程(十)
    white-space屬性有6種值:1) normal默認。空白會被瀏覽器忽略。如:p{white-space:pre-line;}頁面上顯示為 F2E.TMING F2E.TMING F2E.TMING6) inherit規定應該從父元素繼承 white-space 屬性的值。
  • 【教程】html+css零基礎入門教程(九)
    如:p.blink{text-decoration:blink;}頁面上顯示為 F2E.TMING6) inherit規定應該從父元素繼承 text-decoration 屬性的值。p{ word-spacing:25px; }頁面上顯示為flash flash相關文章【教程】html+css零基礎入門教程(一)【教程】html+css零基礎入門教程(二)【教程】html+css零基礎入門教程(三)【教程】html+css零基礎入門教程(四)
  • Fusion360入門教程合集
    前面我們已經學習過了Fusion360一系列的入門教程。為了大家的查閱,今天就把前面的八節入門教程集中地發了一遍。大家可以點擊下面的連接可以查閱。    很多人剛開始學習建模的時候不知道從哪裡入手做。Fusion360入門教程(3)以參考圖片來建模方法
  • Photoshop自學教程(入門)
    今天小編找到了一位學長很久很久之前總結的教程,特意分享給大家!該教程為PS入門級教程,全文沒有介紹任何技巧,但涵蓋了PS幾乎各大常用功能的基本介紹,只要大家認真操作實踐,一定會對PS有一個非常深刻的認識。認識工具欄
  • 【教程】html+css零基礎入門教程之CSS邊框
    border-width: 20px;border-color: #000;B、border-style: none; border-width: 20px;C、border-style: none; border-color: #000;D、border-style: solid;border-color: #000;相關文章【教程
  • MySQL 入門教程
    前端開發工程師為什麼寫這個入門教程呢?最近項目強迫我這個前端老司機使用 MySQL,雖然我在項目中已經使用過一段時間,為了寫出高質量的 SQL 語句,能快速定位解決資料庫引發的問題,系統的過一遍基礎,你也可以當做是我的筆記。有幸也認識一些 MySQL 的 DBA,這讓我學習起來比較快,能快速入門,進入實戰開發階段。
  • 書聲琅琅:好的Python入門教程
    好的Python入門教程,書聲琅琅教育番茄老師微信pykf20介紹,python語言現在應用非常廣泛,不管是大數據還是人工智慧,應用最多的語言還是python,因此對於許多小白來講,看到python從業者的高薪資,想要轉行,或者致力於python開發的朋友,如果要學習python,從零基礎開始,一定需要一套完整的學習路線。
  • 吉他快速入門教程10分鐘學彈曲子
    吉他快速入門教程1,認識吉他吉他由琴軸,琴弦,品格,琴箱,琴碼,撥片等基本組成,琴軸主要起到調節琴弦音準的功能,琴箱主要起到擴音放音作用。吉他弦排列最細的弦開始為1弦2弦3弦4弦5弦6弦,最粗的弦為6弦,在方格橫線代表品,從上到下分別為1品2品3品4品一次類推。
  • TurbulenceFD入門到進階教程
    正式課已經開始教TurbulenceFD製作流體特效了,所以本期分享的是由Lynda出品的TurbulenceFD流體入門到進階的教程
  • 素描入門教程:素描基礎教學-明度關係,素描入門自學教程
    素描入門教程:素描基礎教學-明度關係,素描入門自學教程●明度,素描靜物繪畫中的明度簡單的來講就是光線作用下物體的明暗程度
  • 【技術幹貼】FRAGSTATS 4 官方入門教程 教程1 [中文版]
    原著:Kevin McGarigal翻譯:地理時政志(公眾號、CSDN同名,知乎:Jarviski)FRAGSTATS的官網上有原作者給出的一個很好的軟體入門教程
  • 攝影入門教程:鏡頭焦距是什麼意思?
    丨攝影技巧丨丨攝影入門丨丨攝影教程丨丨攝影圖片丨攝影入門教程:還在被快門、光圈、ISO弄得不知所措?你可能錯過這些攝影文章攝影入門:預算3000元,都有哪些入門級單眼相機推薦?攝影技巧:人像攝影構圖,人像攝影技巧攝影教程:旅遊照片怎麼拍才好看?手機拍照:自拍人太多?
  • 255頁建築工程施工測量新手入門教程,針對性強,測量輕鬆入門
    254頁建築工程施工測量新手入門教程,針對性強,測量輕鬆入門馬上要到工地做測量員了心裏面有點忐忑,就去做了很多年測量的表叔那兒,希望他能教點我什麼。表叔知道我的來意之後給了我這套建築工程施工測量新手入門教程。
  • 《Google SEO 入門教程》更新中文翻譯版
    站長之家(chinaz.com)11月17日消息:本月初,谷歌更新了《Google SEO 入門教程》指南,新入門教程豐富了內容,有了更多的圖文例子,對詞彙定義也更加完善,而谷歌機器人也強勢回歸。
  • 【教程】暢學Arduino入門教程
    本課程是Arduino模塊設計學習從入門到深入的一套經典視頻教程,以初學者為對象,從零開始手把手教你學習Arduino模塊設計與應用
  • 【原創教程】學習資料匯總_houdini之道09_00_05CG獵人原創完全入門教程發布
    houdini之道第二卷完全精通系列1-6卷預售期到明天11號24點就結束優惠,已經有大量同學購買了sop卷I和1-6卷的大禮包,請需要購買的同學抓緊優惠期購買。真正的完全精通,成為大神!    購買加小編微信 carldrifter或者掃描文字二維碼。
  • 一個12分良心的Spark SQL入門教程
    Spark SQL 是 Spark 的一個結構化數據處理模塊,提供了一個 DataFrame 的抽象模型,在 Spark 1.6.0之後,又加入了 DataSet 的抽象模型,因此它是一個分布式 SQL 查詢引擎,Spark SQL 主要由 Catalyst 優化,Spark SQL 內核,Hive 支持三部分組成。
  • 硬筆書法入門_硬筆書法教程_怎麼學好硬筆字?
    硬筆書法入門_硬筆書法教程_怎麼學好硬筆字?樹人字訓思維導圖嵌入式硬筆書法教學,讓老師學生更輕鬆!樹人字訓思維導圖教材把複雜的教學原理簡單化,把枯燥的教學思路趣味化,能快速培訓書法培訓教師,解決缺少書法老師的問題。通過圖文並茂的思維導圖,完全區別於傳統枯燥教學,孩子視覺感新鮮,老師教法有邏輯,不臨摹,不描紅,快速掌握書寫技巧,解決孩子不愛書法學習的問題。