ES6學習筆記 Javascript

字符串模板 Template String

let xxx='你好',yyy = '不好';

let printt = `今天你 ${xxx} ${yyy} 啊`

Tagged Templates 帶標籤的模板字符串

let xxx='你好',yyy = '不好';

let printt = kitchen`今天你 ${xxx} ${yyy} 啊`

function kitchen(strings,...values){
    console.log(strings);
    console.log(values);
}

輸出結果strings爲字符values爲模板字符xxx和yyy的值

判斷字符串是否包含

xxxx.statsWith(‘xxx’);返回true false
同理endWith includes

Deafault Paramet 默認參數

function breakfast(dessert='xx',drink='yy'){
    return '${dessert} ${drink}';
}

xx yy 爲默認

展開操作符Spread …

展開數組 [‘1’,‘2’]變爲1 2
用法用例 console.log(…array);

剩餘操作符 …

function breakfast(dessert,drink,...foods){
    console.log(dessert,drink,foods);
}
breakfast('1','2','3','4');

輸出爲1 2 [‘3’,‘4’];
多餘的參數將以數組的形式放在foods數組裏;

函數名字

xxx.name

箭頭函數 Arrow Functions

let breakfast = dessert =>dessert;

var breakfast = function breakfast(dessert){
    return dessert;
}

上述兩種定義breakfast方法是一樣的
方法一中的dessert爲傳入參數如有多個參數可以寫爲(param1,param2)=>{
操作;
}

對象屬性名

let food = {};

food.dessert = 'xxx';
food['hot drink'] = 'xxx';// 帶空格的屬性名

對比是否相等

Object.is(param1,param2);

對象屬性複製

let breakfast = {};

Object.assign(
breakfast,
{
    xx:'xx';
}
)

第一個參數爲賦值的目標
第二個參數是賦值的值

Object.setPrototypeOf 改變prototype

Object.setPrototypeOf(需要改變的方法名,改變其對象);

proto

let xxx = {
proto:xxxxx(對象名);
}
OR
xxx.proto=xxxxx;

迭代器

迭代器是一個伴隨着迭代器模式(Iterator Pattern)而生的抽象概念,其目的是分離並統一不同的數據結構訪問其中數據的方式,從而使得各種需要訪問數據結構的函數,對於不同的數據結構可以保持相同的接口。

下面是一段ES5的語法創建的迭代器

function createIterator(items) {
    var i = 0;
    return {
        next: function() {
            var done = (i >= items.length);
            var value = !done ? items[i++] : undefined;
            return {
                done: done,
                value: value
            };
        }
    };
}
var iterator = createIterator([1, 2, 3]);
console.log(iterator.next()); // "{ value: 1, done: false }"
console.log(iterator.next()); // "{ value: 2, done: false }"
console.log(iterator.next()); // "{ value: 3, done: false }"
console.log(iterator.next()); // "{ value: undefined, done: true }"
// 之後的所有調用
console.log(iterator.next()); // "{ value: undefined, done: true }"

在上面這段代碼中,createIterator()方法返回的對象有一個next()方法,每次調用時,items數組的下一個值會作爲value返回。當i爲3時,done變爲true;此時三元表達式會將value的值設置爲undefined。最後兩次調用的結果與ES6迭代器的最終返回機制類似,當數據集被用盡後會返回最終的內容

上面這個示例很複雜,而在ES6中,迭代器的編寫規則也同樣複雜,但ES6同時還引入了一個生成器對象,它可以讓創建迭代器對象的過程變得更簡單。

生成器 Generators

生成器是一種返回迭代器的函數,通過function關鍵字後的星號(*)來表示,函數中會用到新的關鍵字yield。星號可以緊挨着function關鍵字,也可以在中間添加一個空格

// 生成器
function *createIterator() {
    yield 1;
    yield 2;
    yield 3;
}
// 生成器能像正規函數那樣被調用,但會返回一個迭代器
let iterator = createIterator();
console.log(iterator.next().value); // 1
console.log(iterator.next().value); // 2
console.log(iterator.next().value); // 3

在這個示例中,createlterator()前的星號表明它是一個生成器;yield關鍵字也是ES6的新特性,可以通過它來指定調用迭代器的next()方法時的返回值及返回順序。生成迭代器後,連續3次調用它的next()方法返回3個不同的值,分別是1、2和3。生成器的調用過程與其他函數一樣,最終返回的是創建好的迭代器

生成器函數最有趣的部分是,每當執行完一條yield語句後函數就會自動停止執行。舉個例子,在上面這段代碼中,執行完語句yield 1之後,函數便不再執行其他任何語句,直到再次調用迭代器的next()方法纔會繼續執行yield 2語句。生成器函數的這種中止函數執行的能力有很多有趣的應用

使用yield關鍵字可以返回任何值或表達式,所以可以通過生成器函數批量地給迭代器添加元素。例如,可以在循環中使用yield關鍵字。

function *createIterator(items) {
    for (let i = 0; i < items.length; i++) {
        yield items[i];
    }
}
let iterator = createIterator([1, 2, 3]);
console.log(iterator.next()); // "{ value: 1, done: false }"
console.log(iterator.next()); // "{ value: 2, done: false }"
console.log(iterator.next()); // "{ value: 3, done: false }"
console.log(iterator.next()); // "{ value: undefined, done: true }"
// 之後的所有調用
console.log(iterator.next()); // "{ value: undefined, done: true }"

在此示例中,給生成器函數createlterator()傳入一個items數組,而在函數內部,for循環不斷從數組中生成新的元素放入迭代器中,每遇到一個yield語句循環都會停止;每次調用迭代器的next()方法,循環會繼續運行並執行下一條yield語句

class Xxx{
    constructor(param1,...){
        this.xxx = xxx;
        this.yyy = [];
    }
    
    get zzz(yyy){
        return yyy;
    }
    
    set zzz(yyy){
        this.yyy.push(yyy);
    }
    
    xxx(){
        console.log(x);
    }
}

let xxx1 = new Xxx(xxx);
xxx1.xxx();

以上是一個簡單的實例

get & set 用例如上

static 靜態類

靜態類不需要實例化類
不需要new

class Xxx{
    constructor(param1,...){
        this.xxx = xxx;
        this.yyy = [];
    }
    
    
    static xxx(){
        console.log(x);
    }
}

Xxx.xxx();//不需要new

繼承 extend

class Person{
    construcor(name,birthday){
        this.name = name;
        this,birthday = birthday;
    }
    
    intro(){
        return '${this.name} ${this.birthday}';
    }
}

class Xxx extends Person{
    constructor(name,birthday){
    super(name,birthday);//不需要再次寫構造函數。
}

Set

let xxx = new Set();
xxx.add('x');//添加方法
xxx.add('x');//不能重複
console.log(xxx.size);//輸出長度
console.log(xxx.has('y');//判斷是否有y
//刪除方法
xx.delete('x');
//循環處理
xxx.forEach(xx=>{
    console.log(xx);
});
//清除Set內的內容
xxx.clear();

Map

let xxx = new Map();
let yyy = [],zzz = function(){},aaa='abc';
xxx.set(yyy,'a');//往xxx內添加一個yyy的值爲a
//同理zzz和aaa
console.log(xxx.size);//輸出長度
console.log(xxx.get(yyy));//可以得到yyy;
//刪除方法
xx.delete('x');
console.log(xxx.has('y');//判斷是否有y
//循環處理
xxx.forEach((value,key)=>{
    console.log('${key}=${value}');
});
//清除Map內的內容
xxx.clear();

方法大致和Set相似

Module

export{
    xxx;
}

在需要導入的頁面:

import {xxx} form 'url';

或者

import * as yyy from 'url';
console.log(yyy.xxx);

默認導出

export default{
    
}
//需要導入的頁面
import x(隨意) form 'url'//此時的x就是默認導出的東西
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章