Ecmascript 6 ECMAScript 6.0(以下簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發佈了。 Ecmascript 是 JavaScript 語言的標註規範 JavaScript 是 Ecmascript 規範的具體實現 + 具體實現取決於各大瀏覽 ...
Ecmascript 6
- ECMAScript 6.0(以下簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發佈了。
- Ecmascript 是 JavaScript 語言的標註規範
- JavaScript 是 Ecmascript 規範的具體實現
- 具體實現取決於各大瀏覽器廠商的支持進度
- Ecmascript 6 也被稱作 Ecmascript 2015
- 各大瀏覽器廠商對於最新的 Ecmascript 6 標準支持可以參照:
- 對於不支持 ES6 的環境,可以使用一些編譯轉碼工具做轉換處理再使用
- 例如 babel
let 和 const
let:
- let 類似於 var,用來聲明變數
- 通過 let 聲明的變數不同於 var,只在 let 命令所在的代碼塊內有效(塊級作用域)
- let 聲明的變數不存在變數提升
- let不允許在相同作用域內,重覆聲明同一個變數
const:
- const聲明一個只讀的常量。一旦聲明,常量的值就不能改變
- const 聲明必須初始化
- const的作用域與let命令相同:只在聲明所在的塊級作用域內有效
- const命令聲明的常量也是不提升,必須先聲明後使用
- const聲明的常量,也與let一樣不可重覆聲明
解構賦值
ES6 允許按照一定模式,從數組和對象中提取值,對變數進行賦值,這被稱為解構(Destructuring)。
數組解構:
let [a, b, c] = [123, 456, 789]
console.log(a, b, c) 123 456 789
對象解構:
let { name, age } = { name: 'Jack', age: 18 }
console.log(name, age) Jack 18
函數參數解構:
function f (p1, { p2 = 'aa', p3 = 'bb' }) {
console.log(p1, p2, p3)
}
f('p1', { p2: 'p2' }) p1 p2 bb
字元串解構:
let [a, b, c, d, e] = 'hello'
console.log(a, b, c, d, e) h e l l o
字元串
實用方法:
includes(String):返回布爾值,表示是否找到了參數字元串。
startsWith(String):返回布爾值,表示參數字元串是否在源字元串的頭部。
endsWith(String):返回布爾值,表示參數字元串是否在源字元串的尾部。
repeat(Number):repeat方法需要指定一個數值,然後返回一個新字元串,表示將原字元串重覆Number次。
模板字元串:
let basket = { count: 5, onSale: true }
$('#result').append(`
There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!
`);
- 模板字元串(template string)是增強版的字元串,用反引號(`)標識
- 它可以當作普通字元串使用,也可以用來定義多行字元串,或者在字元串中嵌入變數
- 如果使用模板字元串表示多行字元串,所有的空格和縮進都會被保留在輸出之中
- 模板字元串中嵌入變數,需要將變數名寫在
${}
之中- 大括弧內部可以放入任意的JavaScript表達式,可以進行運算,以及引用對象屬性
- 大括弧內部還可以調用函數
數組
方法:
Array.from() 將一個偽數組轉為一個真正的數組
實際應用中,常見的類似數組的對象是DOM操作返回的NodeList集合,
以及函數內部的arguments對象。Array.from都可以將它們轉為真正的數組。
Array.of() Array.of方法用於將一組值,轉換為數組
這個方法的主要目的,是彌補數組構造函數Array()的不足。
因為參數個數的不同,會導致Array()的行為有差異。
find() 查找數組中某個元素
findIndex() 查找數組中某個元素的索引下標
includes() 返回一個布爾值,表示某個數組是否包含給定的值,與字元串的includes方法類似
實例方法:
ES6提供三個新的方法——entries(),keys()和values()——用於遍曆數組.
可以用 for...of
迴圈進行遍歷,唯一的區別是 keys()
是對鍵名的遍歷、
values()
是對鍵值的遍歷,entries()
是對鍵值對的遍歷。
entries()
keys()
values()
函數的擴展
函數參數的預設值:
ES6 允許為函數的參數設置預設值,即直接寫在參數定義的後面。
function log(x, y = 'World') {
console.log(x, y);
}
log('Hello') Hello World
log('Hello', 'China') Hello China
log('Hello', '') Hello
- 通常情況下,定義了預設值的參數,應該是函數的尾參數
- 因為這樣比較容易看出來,到底省略了哪些參數
- 如果非尾部的參數設置預設值,實際上這個參數是沒法省略的。
- 指定了預設值以後,函數的length屬性,將返回沒有指定預設值的參數個數
- 也就是說,指定了預設值後,length屬性將失真
rest 參數:
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) 10
擴展運算符:
console.log(...[1, 2, 3]) 1 2 3
console.log(1, ...[2, 3, 4], 5) 1 2 3 4 5
箭頭函數:
var f = v => v
上面的箭頭函數等同於:
var f = function(v) {
return v
}
- 箭頭函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象
- 箭頭函數不可以當作構造函數,也就是說,不可以使用new命令,否則會拋出一個錯誤
- 箭頭函數內部不可以使用arguments對象,該對象在函數體內不存在
- 如果要用,可以用Rest參數代替
對象
屬性的簡潔表示法:
var foo = 'bar';
var baz = {foo};
baz {foo: "bar"}
等同於
var baz = {foo: foo}
除了屬性簡寫,方法也可以簡寫:
var o = {
method() {
return "Hello!"
}
}
等同於
var o = {
method: function() {
return "Hello!"
}
}