function log(x, y = 'World') {
console.log(x, y)
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
複製代碼
function f(...values){
console.log(values.length)
}
f(1,2) //2
f(1,2,3,4) //4
複製代碼
//ES5
var f = function (a,b) {
return a+b
}
//ES6
var f = (a,b) => {
return a+b
}
複製代碼
遍歷器(Iterator)是一種接口,爲各類不一樣的數據結構提供統一的訪問機制。任何數據結構只要部署Iterator接口,就能夠完成遍歷操做(即依次處理該數據結構的全部成員)。數組
let arr = ['a', 'b', 'c']
let iter = arr[Symbol.iterator]()
iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }
複製代碼
for...of 是 ES6 新引入的循環,用於替代 for..in 和 forEach() ,而且支持新的迭代協議。它可用於迭代常規的數據類型,如數組、Set 和 Map 結構、某些相似數組的對象(好比arguments對象、DOM NodeList 對象)、Generator 對象以及字符串。bash
class Point {
constructor(x, y) {
this.x = x
this.y = y
}
toString() {
return '(' + this.x + ', ' + this.y + ')'
}
}
複製代碼
方法是類的默認方法,經過new命令生成對象實例時,自動調用該方法。一個類必須有constructor方法,若是沒有顯式定義,一個空的constructor方法會被默認添加。數據結構
生成類的實例的寫法,與 ES5 徹底同樣,也是使用new命令。函數
class Point {
// ...
}
var point = new Point(2, 3)
複製代碼
在「類」的內部可使用get和set關鍵字,對某個屬性設置存值函數和取值函數,攔截該屬性的存取行爲。ui
class Point {
constructor(x = 1) {
this.x = x
}
get xx() {
return this.x
}
set xx(val) {
this.x = val
}
}
const point = new Point()
point.xx = 99
console.log(point.x) //99
複製代碼
若是在一個方法前,加上static關鍵字,就表示該方法不會被實例繼承。this
class Foo {
static classMethod() {
return 'hello'
}
}
Foo.classMethod() // 'hello'
var foo = new Foo()
foo.classMethod()
// TypeError: foo.classMethod is not a function
複製代碼
父類的靜態方法,能夠被子類繼承。spa
class Foo {
static classMethod() {
return 'hello'
}
}
class Bar extends Foo {
}
Bar.classMethod() // 'hello'
複製代碼
實例屬性除了定義在constructor()方法裏面的this上面,也能夠定義在類的最頂層。rest
class foo {
bar = 'hello'
baz = 'world'
constructor() {
// ...
}
}
複製代碼
class ColorPoint extends Point {
constructor(x, y, color) {
super(x, y) // 調用父類的constructor(x, y)
this.color = color
}
toString() {
return this.color + ' ' + super.toString() // 調用父類的toString()
}
}
複製代碼
Object.getPrototypeOf方法能夠用來從子類上獲取父類。code
class A {}
class B extends A {
constructor() {
super()
}
}
複製代碼
class A {
p() {
return 2
}
}
class B extends A {
constructor() {
super()
console.log(super.p()) // 2
}
}
let b = new B()
複製代碼
原生構造函數的繼承對象
ECMAScript 的原生構造函數大體有下面這些:
/*-----export [test.js]-----*/
let myName = "Tom"
let myAge = 20
let myfn = function(){
return "My name is" + myName + "! I'm '" + myAge + "years old."
}
let myClass = class myClass {
static a = "yeah!"
}
export { myName, myAge, myfn, myClass }
/*-----import [xxx.js]-----*/
import { myName, myAge, myfn, myClass } from "./test.js"
console.log(myfn())// My name is Tom! I'm 20 years old. console.log(myAge)// 20 console.log(myName)// Tom console.log(myClass.a )// yeah! 複製代碼
export 命令導出的接口名稱,須和模塊內部的變量有一一對應關係。
導入的變量名,須和導出的接口名稱相同,即順序能夠不一致。
/*-----export [test.js]-----*/
let myName = "Tom"
export { myName as exportName }
/*-----import [xxx.js]-----*/
import { exportName } from "./test.js"
console.log(exportName)// Tom
使用 as 從新定義導出的接口名稱,隱藏模塊內部的變量
/*-----export [test1.js]-----*/
let myName = "Tom"
export { myName }
/*-----export [test2.js]-----*/
let myName = "Jerry"
export { myName }
/*-----import [xxx.js]-----*/
import { myName as name1 } from "./test1.js"
import { myName as name2 } from "./test2.js"
console.log(name1)// Tom
console.log(name2)// Jerry
複製代碼
import {a} from "./xxx.js"
a = {} // error
import {a} from "./xxx.js"
a.foo = "hello" // a = { foo : 'hello' }
複製代碼
import { a } "./xxx.js"
import { a } "./xxx.js"
// 至關於 import { a } "./xxx.js"
import { a } from "./xxx.js"
import { b } from "./xxx.js"
// 至關於 import { a, b } from "./xxx.js"
複製代碼
import { "f" + "oo" } from "methods"
// error
let module = "methods"
import { foo } from module
// error
if (true) {
import { foo } from "method1"
} else {
import { foo } from "method2"
}
// error
複製代碼
var a = "My name is Tom!"
export default a
export default var c = "error"
// error,default 已是對應的導出變量,不能跟着變量聲明語句
import b from "./xxx.js" // 不須要加{}, 使用任意變量接收
複製代碼