ES6 快速入門
阿新 • • 發佈:2018-07-01
函數 years 綁定 允許 emp pan 提升 推薦 由於
快速了解ES6部分新特性。。。
let
ES6新增了let命令,用於聲明變量。其用法類似var,但是聲明的變量只在let命令所在的代碼塊內有效。{ let x = 10; var y = 20; } x // ReferenceError: x is not defined y // 20
var聲明變量存在變量提升。也就是在聲明變量之前就可以使用該變量。
console.log(x) // undefined,var聲明變量之前可以使用該變量 var x = 10;
而let不會這樣,let聲明的變量不能在聲明之前使用。
console.log(x) //註意: let不允許在相同的作用域內重復聲明同一個變量。 比如:ReferenceError: x is not defined,let聲明變量之前不可以使用該變量 let x = 10;
function foo(){ let x = 10; var x = 20; } // 報錯
再比如:
function foo(){ let y = 10; let y = 20; } // 報錯ES5中只有全局作用域和函數作用域,並沒有塊級作用域。 請看下面的示例:
var name = ‘Q1mi‘ function出現上述現象的原因就是在函數內部,由於變量提升導致內存的name變量覆蓋了外層的name變量。 類似的情況還出現在 for循環的計數變量最後會泄露為全局變量。foo(){ console.log(name) if (false){ var name = ‘Bob‘ } } foo() // undefined
for (var i=0;i<5;i++){ console.log(‘哈哈‘); } console.log(i); // 5
ES6中的let聲明變量的方式實際上就為JavaScript新增了塊級作用域。
var name = ‘Q1mi‘ function foo(){ console.log(name) if (false){ let name = ‘Bob‘ } } foo() // Q1mi
此時,在foo函數內容,外層代碼塊就不再受內層代碼塊的影響。所以類似for循環的計數變量我們最好都是用let來聲明。
const
const用來聲明常量。const聲明變量必須立即初始化,並且其值不能再改變。 const聲明常量的作用域與let相同,只在聲明所在的塊級作用域內有效。 例如:const PI = 3.14;
全局對象的屬性:
ES6規定:var命令和function命令聲明的全局變量依舊是全局對象的屬性;let命令、const命令和class命令聲明的全局變量不屬於全局對象的屬性。
查看下面的示例代碼:
var x = 10; let y = 20; window.x // 10 window.y // undefined
變量的解構賦值
ES6允許按照一定的模式,從數組或對象中提取值,對變量進行賦值,這種方式被稱為解構賦值。
var [x, y, z] = [10, 20, 30] x // 10 y // 20 z // 30
對象的解構賦值:
var {x, y} = {x: 10, y: 20} x // 10 y // 20
模板字符串
模板字符串(template string)是增強版的字符串,用反引號(`)標識。它可以當做普通字符串使用,也可以用來定義多行字符串,或者在字符串中嵌入變量。在模板字符串中嵌入變量,需要將變量名寫入${}中。
var name = ‘Q1mi‘, age = 18; `My name is ${name}, I’m ${age} years old.`
箭頭函數
箭頭函數中this指向會被固定化。這不是因為箭頭函數內部有綁定this的機制。實際原因是箭頭函數根本沒有自己的this,導致內部的this就是外層代碼塊的this。 可以查看下面兩段代碼輸出的區別:var person = { name: ‘Q1mi‘, age:18, func:function(){ console.log(this); } } person.func() // person對象
和
var person = { name: ‘Q1mi‘, age:18, func:()=>{ console.log(this); } } person.func() // window對象
屬性簡潔表示法
ES6允許直接寫入變量和函數作為對象的屬性和方法。function (x, y){ return {x, y} }
上面的寫法等同於:
function(x, y){ return {x: x, y: y} }
對象的方法也可以使用簡潔表示法:
var o = { method(){ return “Hello!”; } }
等同於:
var o = { method: function(){ return “Hello!”; } }
面向對象
ES5的構造對象的方式 使用構造函數來創造。構造函數唯一的不同是函數名首字母要大寫。function Person(name, age){ // 點方法 set方法和get方法 this.name = name; this.age = age; this.func = function(){ ... } } // 給父級綁定方法 Person.prototype.showName = function(){ console.log(this.name); } var p = new Person(‘q1mi’, 18); console.log(p.name) p.showName();
ES6 構造對象的方式:
class Person{ constructor(name, age){ this.name = name; this.age = age; } // 不要加逗號!!! showName(){ console.log(this.name); } } var p = new Person()
附:
有關ES6的其他新特性,推薦閱讀:阮一峰的ECMAScript 6 入門
ES6 快速入門