前言
2015年正式通過ECMAScript6標準。前端技術日新月異,現如今ES6已納入許多企業的開發標準之中。ES6相較ES5有了巨大的變換,新增內容令人目不暇接,看到這冗長的列表目錄,是否你也會覺得腦殼疼?
我將在本篇文章中整理出ES6中一些十分利好的技能點,讓大家能夠更快上手ES6。
本系列文章,目的在於讓還不熟悉ES6的同學快速上手,找到一個學習ES6的切入點,想要了解更全面的知識點,需要大家自行摸索。
話不多說,我們開門見山,直接進入正題。
let const
ES6新增了兩種變數宣告方式。
let: 宣告一個塊內有效的變數。
const: 宣告一個常量,只可賦值一次,且需在宣告時初始化值。
let a = 1;
const b = 2;
b = 3; // Uncaught TypeError: Assignment to constant variable.
複製程式碼
還記得,在for迴圈語句中用var宣告變數常發生得意想不到的問題嘛?
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //10
複製程式碼
這個問題通過let就可以得到很好的解決。
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //6
複製程式碼
const則可以用於宣告一些常用的不變值,如 const PI = 3.141。
變數解構賦值
ES6允許按照一定模式,從陣列和物件中提取值,這被稱為解構。你需要按照目標物件的結構來構造一套對映結構,其中的變數會取對應的值。用通俗的話說,一個蘿蔔一個坑,成熟時間到了,你挖開對應的坑就可以取到相應的蘿蔔。
以前為變數賦值,需要一個個指定值。
let a = 1;
let b = 2;
複製程式碼
使用解構賦值:
let [a, b, c] = [1,2,3];
a === 1; //true
b === 2; //true
c === 3; //true
複製程式碼
坑和蘿蔔的位置和結構必須一一對應,你才能拿到想要的蘿蔔。
物件的解構賦值:
var obj = {foo: 'aaa', bar: 'ccc'};
const { foo, bar } = obj;
console.log(foo, bar);// aaa ccc
複製程式碼
模板字串
以前組合輸出變數和字串時需要用雙引號一段段拼接,需要換行尤其頭疼,還需要插入換行符,這樣既不美觀也很難寫,現在我們可以使用模板字串,它更加快捷,並且能夠保持你的輸出格式。
var name = 'Ein';
console.log(
`
hello,
${name},
my dear love!
`
);
//
hello,
Ein,
my dear!
複製程式碼
使用“ ` ”符號包裹你的字串,變數“ ${ } ”來包裹你的變數,大膽使用空格和換行符,所寫即所見,模板字串會完全保留你的輸入格式。
箭頭函式
箭頭函式可以讓你的程式碼更優雅,你無需再一遍又一遍的拼寫“function”。
var f = funciton (v) {
return v;
};
複製程式碼
同下:
var f = (v) => {return v};
複製程式碼
只有一個引數時,可以省略小括號。函式體只有一條語句時,可以省略大括號,若這條語句是一個值,將作為函式的返回值。
var f = v => v;
複製程式碼
注意: 箭頭函式會繫結this到函式定義時所在的物件,這有時是一個優勢點,代替bind和call方法。有時也會造成意想不到的問題。
函式引數預設值
ES6之前,如果要為函式引數新增預設值,你需要這樣寫。
function log(y) {
y = y || 'ein';
console.log('hello ' + y);
};
log('world'); //hello world
log(); //hello ein
log(''); //hello ein
複製程式碼
這種寫法的缺點在於,如果引數y轉化為布林值後值為false,則該賦值不起作用。
使用ES6,新增預設引數
function Point(x = 0, y = 0) {
this.x = x;
this.y = y;
};
const p = new Point(); //{x: 0, y: 0}
複製程式碼
雙冒號運算子(繫結this)
ES6之前繫結this,我們需要使用bind,call,apply等方法,ES6中我們可以使用箭頭函式,但是箭頭函式在某些場合也不適用。我們可以使用雙冒號來繫結this。
bar.bind(foo);
//等同於
foo::bar
bar.apply(foo, arguments);
//等同於
foo::bar(...arguments);
複製程式碼
class
ES6的最重要改進,大概是在寫法上更加貼近於面嚮物件語言了。class關鍵字的引入,讓Javasript更加優美。 如果在使用高版本React,你一定對class不會陌生。
ES6之前生成例項物件的常用方法是使用建構函式。
function Prophet (x, y) {
this.x = x;
this.y = y;
};
Prophet.prototype.intro = function () {
console.log(`I'm a prophet, I have ${this.x} and ${this.y}!`);
};
var p = new Prophet('soul', 'special power');
p.intro();
//I'm a prophet, I have soul and special power!
複製程式碼
ES6的class可以看作只是一個語法糖,作為物件的模板,使用class關鍵字,可以定義類。上面的例子可以這樣寫:
class Prophet {
constructor(x, y) {
this.x = x;
this.y = y;
}
intro () {
console.log(`I'm a prophet, I have ${this.x} and ${this.y}!`);
}
};
let p = new Prophet();
複製程式碼
通過類構建物件例項的方法和使用建構函式相同,通過new操作符生成一個類的例項物件,不適用new會報錯。
p.constructor === Prophet.prototype.constructor //true
Prophet.prototype
//{constructor: ƒ, intro: ƒ}
複製程式碼
類的所有方法都定義在類的prototype屬性上面。
super關鍵字
The super keyword is used to access and call functions on an object's parent. (摘自MDN)
作用:super關鍵字用於訪問和呼叫物件父類上的函式。
- super關鍵字可以當函式呼叫,也可以當作物件使用。
super作為函式呼叫,代表父類的建構函式。
class A {};
class B extends A {
constructor() {
super();
}
}`
複製程式碼
Module
為了更好的構建大型的,複雜的專案,Javascript需要支援模組體系,ES6引入了模組語法。
- 通過export和import命令來匯出和匯入模組。
export
一個模組就是一個獨立的檔案,該檔案內部的變數,外部無法獲取。export命令可以對外部開放訪問許可權。
export let name = 'zwei';
export let age = 1000;
export let sex = 'male';
複製程式碼
let name = 'zwei';
let age = 1000;
let sex = 'male';
export { name, age, sex };
複製程式碼
上面兩種方法都可以輸出變數,少量變數可以採用第一種方式;若存在許多變數需要輸出,第二種寫法會更加清晰直觀,便於閱讀。
export 命令同樣可以輸出函式或類(clss)。
重新命名
根據需要可以使用as關鍵字對輸出的變數進行重新命名。
export {
p1 as name,
p2 as age,
p3 as sex
};
複製程式碼
export dafalut
export default class Tree extends React.Component {}
複製程式碼
export default命令用於指定模組的預設輸出。
import
模組中的變數輸出後,我們便具備了訪問許可權。但要使用這些模組中的變數,還需要使用import命令引入模組。 我們此前所輸出的三個變數在名為'utils.js'的檔案中。
import { name, age, sex } from 'utils.js';
function say () {
console.log(`my name is ${name}, I'm ${age} years old, I'm a ${sex}`);
};
複製程式碼
整體載入
import * as variables from 'utils.js';
function say () {
console.log(`my name is ${variables.name}, I'm ${variables.age} years old, I'm a ${variables.sex}`);
};
複製程式碼
根據你要使用的情況,引入變數,名稱需要與輸出的變數名稱相同,接著便可以使用了。
後續
本篇文章對ES6中常用的一些功能點進行了簡單介紹,旨在引導大家快速瞭解ES6語法,並未對各個知識點進行詳細講解,需要深入學習可以查詢其它資料。
後續還將介紹ES6中一些簡單方便的API以及強大的js非同步解決方案,敬請期待!