??ES6學(xué)習(xí)之路

0. ECMAScript 6 簡介

  • ECMAScript 6.0?
    ES6是 JavaScript 語言的下一代標(biāo)準(zhǔn),已經(jīng)在 2015 年 6 月正式發(fā)布了。它的目標(biāo),是使得 JavaScript 語言可以用來編寫復(fù)雜的大型應(yīng)用程序,成為企業(yè)級開發(fā)語言。
    在ES6之前,js只有全局作用域和函數(shù)作用域,ES6中l(wèi)et關(guān)鍵字為其引入了塊級作用域。
  • ECMAScript 和 JavaScript 的關(guān)系?。
    ECMAScript 和 JavaScript 的關(guān)系:前者是后者的語法規(guī)格,后者是前者的一種實(shí)現(xiàn).
    我把JavaScript近似等同于ECMAScript(ES), 而ES6 = ES5 + 新特性,所以ES6和ES5都相當(dāng)于JavaScript。

1. 塊級作用域的引入

{
var a = 5;
let  b = 6;
}
console.log(a);     //5
console.log(b);     //b is undefined

let聲明的變量只能在其所在的代碼塊內(nèi)才能訪問,var聲明的變量由于是全局變量,因此可以在代碼塊外訪問

2. 暫時(shí)性死區(qū)

var聲明的變量可以在聲明之前使用,相當(dāng)于默認(rèn)為其聲明其值為undefined了;

但是,let聲明的變量一旦用let聲明,那么在聲明之前,此變量都是不可用的,術(shù)語稱為“暫時(shí)性死區(qū)”。

console.log(a);                     //undefined
var a=8;
console.log("----------");
console.log(b);                     //控制臺報(bào)錯(cuò)
let b=9;

所以我們要養(yǎng)成變量先聲明再使用的好習(xí)慣。

3. const命令

const用來定義常量,相當(dāng)于java中的final關(guān)鍵字。

并且const聲明常量之后就必須立即初始化!

4. 解構(gòu)賦值

let [a,b,c] = [1,2,3];
let{x1,x2} = {x2:5,x1:6};
const [a,b,c,d,e]= "hello";
let {data} = await http.post(url,params);
function  add([i,j]) {}---add([5,6]);

可以理解為“模式匹配”

5.模板字符串

// 普通字符串
`In JavaScript '\n' is a line-feed.`

// 多行字符串
`In JavaScript this is
 not legal.`

console.log(`string text line 1
string text line 2`);

// 字符串中嵌入變量
let name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`

${主體},其中主體可以是表達(dá)式、運(yùn)算、對象屬性還可以是函數(shù),若是字符串將直接輸出該字符串。

6. 含參函數(shù)的調(diào)用

function say(something){
    console.log("she say"+" '"+something+"'" );
}
say`hello`;                             //she say 'hello'

7.數(shù)值拓展

ES6也為數(shù)值類對象例如Number、Math添加了新的方法以及屬性(常量)

    // 檢查是不是有限的 (-2^53,2^53)
    console.log(Number.isFinite(1)) // true
    console.log(Number.isFinite(NaN)) // false
    console.log(Number.isFinite(1/0)) // false
   
     // 檢查是不是NaN
    console.log(Number.isNaN(NaN)) // true
    console.log(Number.isNaN(0)) // false
   // 檢查是不是整數(shù)
    console.log(Number.isInteger(1)) //true
    // 這要注意
    console.log(Number.isInteger(1.0)) //true
    
    console.log(Number.isInteger(1.1)) //false
    console.log(Number.isInteger('1')) //false
   // 最大和最小安全數(shù)值
    console.log(Number.MAX_SAFE_INTEGER)
    console.log(Number.MIN_SAFE_INTEGER)
    
    console.log(Number.isSafeIntger(1)) //true
  // 取整
    console.log(Math.trunc(1.1)) //1
    console.log(Math.trunc(1.9)) //1
    //判斷一個(gè)數(shù)到底是正數(shù)、負(fù)數(shù)、還是零
    console.log(Math.sign(-2)) //-1
    console.log(Math.sign(0)) // 0
    console.log(Math.sign(2)) // 1
    console.log(Math.sign('2')) // 1
    console.log(Math.sign('aa')) // NaN

8. 函數(shù)function

function show(name="jack",sex="boy"){
    console.log(name+" is a "+sex+"!");
}
show();                                  //jack is a boy!
show('judy');                            //judy is a boy!
show('judy','girl');                     //judy is a girl!

為函數(shù)的參數(shù)添加默認(rèn)值,執(zhí)行函數(shù)時(shí)如果不傳該參數(shù),那么就用默認(rèn)值代替。
箭頭函數(shù):

var f = v => v;
//等同于
var f = function(v) {
  return v;
};

var f = () => 5;
// 等同于
var f = function () { return 5 };

var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
  return num1 + num2;
};

注意:如果return的是一個(gè)對象{id:id,age:age},那么箭頭右邊要用括號包起來().

9. 數(shù)組的擴(kuò)展

擴(kuò)展運(yùn)算符為三個(gè)點(diǎn)(...),將一個(gè)數(shù)組轉(zhuǎn)化為參數(shù)序列,通常與函數(shù)一起使用,show(...['judy','girl'])。

數(shù)組合并:[...arr1,...arr2,...arr3]

字符串轉(zhuǎn)字符數(shù)組:[..."hello"]--------------["h","e","l","l","o"]

將實(shí)現(xiàn)Iterator接口的對象轉(zhuǎn)化為真正的數(shù)組:[...nodelist],這里的nodelist是一個(gè)類似于數(shù)組的nodelist對象
Generator 函數(shù):該函數(shù)執(zhí)行后返回一個(gè)遍歷器對象,拓展運(yùn)算符也可將其轉(zhuǎn)化為數(shù)組。

let a =function*(){
    yield 3;
    yield 4;
    yield 5;
    return 6;
};
console.log([...a()]); 

只有執(zhí)行a().next(),函數(shù)內(nèi)部的語句才會執(zhí)行一次,每調(diào)用一次next()函數(shù)執(zhí)行一次內(nèi)部函數(shù).
next()函數(shù)有一個(gè)可選參數(shù),用來表示上一次yield表達(dá)式值。
e.g:

function* foo(x) {
  var y = 2 * (yield (x + 1));
  var z = yield (y / 3);
  return (x + y + z);
}

var b = foo(5);
b.next()                   // { value:6, done:false }
b.next(12)                 // { value:8, done:false }
b.next(13)                 // { value:42, done:true }

解析:
第一次next(),x=5,那么yield(x+1)=6---{value:6,done:false}
第二次next(12),令yield(x+1)=12,那么y=24,輸出yield(y/3)=8---{value:8,done:false}
第三次next(13),令yield(y/3)=13,前面yield(x+1)=12,那么最終z=13,y=24,x=5,return (x+y+z)=42---{value:42,done:true}

10. 數(shù)組的方法

Array.from(對象,對新數(shù)組各項(xiàng)的改動(dòng)規(guī)則)
這里的對象只適合①類數(shù)組對象②實(shí)現(xiàn)Iterator接口的對象;后面的規(guī)則可選
e.g:
Array.from([1, 2, 3], (x) => x * x) //這里將數(shù)組每項(xiàng)按一定規(guī)則改變生成新數(shù)組[1,4,9]

Array.of(數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3)
將一組數(shù)據(jù)轉(zhuǎn)化為數(shù)組
e.g:
Array.of(1,2,3,4,5) //[1,2,3,4,5]
find(規(guī)則)、findIndex(規(guī)則)

這里的規(guī)則是一個(gè)回調(diào)函數(shù),找到了就返回這個(gè)數(shù)組項(xiàng)/索引,找不到返回undefined/-1
e.g:
[9,8,7,6,5,4,3].find(n=>n<5) //返回4

還可以添加第二個(gè)參數(shù),如下

function f(v){
    return v > this.age;
}
let  c =function(v){
    return v > this.age;
}
let person = {name: 'John', age: 20};
let a  =[10, 12, 26, 15].find(c, person);            //c、f都可以  
console.log(a);

for...of遍歷數(shù)組的鍵、值、以及各項(xiàng)鍵值對信息

for (let index of ['a', 'b'].keys()) {
    console.log(index);
}
// 0
// 1

for (let elem of ['a', 'b'].values()) {
    console.log(elem);
}
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
    console.log(index, elem);
}
// 0 "a"
// 1 "b"

11. 對象的拓展

對象里面可以直接寫入變量和函數(shù)

//before:
var person = {
    name:'eco',
    age:18,
    say:function(something){
        console.log("hello "+something);
    }
};
person.say('world');

//now:
var firstname='jack';
var man = {
    firstname,
    say(something){
        console.log(this.firstname);
        console.log("hello "+something);
    }
};
man.say('world');

Object.is(值1,值2)用于比較兩個(gè)值是否相等,返回布爾值

Object.assign(targetobject,sourceobject1,sourceobject2)

Object.assign([],old,new); // 返回一個(gè)合并后的對象

用于對象的合并,將源對象合并到目標(biāo)對象,若有相同屬性源對象屬性覆蓋目標(biāo)對象屬性
如果源對象是其他數(shù)據(jù)類型,只有字符串會以字符數(shù)組形式拷到目標(biāo)對象,其他類型不會有效果。

const v1 = 'abc';
const v2 = true;
const v3 = 10;

const obj = Object.assign({}, v1, v2, v3);
console.log(obj);           // { "0": "a", "1": "b", "2": "c" }

12. Set和Map數(shù)據(jù)結(jié)構(gòu)

  • Set:成員不重復(fù)的類數(shù)組結(jié)構(gòu)

Set屬性:size---返回成員總數(shù)

Set操作方法:add(value)---返回Set、delete(value)---返回布爾、has(value)---返回布爾、clear()---無返回值

Set遍歷方法:keys()---返回鍵(索引)的遍歷器、values()---返回值的遍歷器、
WeakSet:類似于Set,只是它的成員只能是對象,沒有size,不能遍歷

  • Map:廣義上的鍵值對集合,鍵的范圍不局限于字符串,對象也可以當(dāng)作鍵
    Map操作方法:set(key,value)---設(shè)置成員、get(key)---讀取指定鍵的值,若無返回undefined
const set = new Set([1, 2, 3, 4, 4]);
//[...set]---[1,2,3,4]

const map = new Map([
    ['name', '張三'],
    ['title', 'Author']
]);

13.類

// Before
// define a class
function Cat(name,color){
            return {
                name:name,
                color:color
            }
        }

var cat1 = Cat('big','yellow');
var cat2 = Cat('small','black');

console.log(cat1.name +' '+cat1.color);
console.log(cat2.name+' '+cat2.color);

ES6之前的類繼承

// 利用空對象做中介

function Animal(){}

Animal.prototype.species = 'Animal';

function Cat(name,color){
    this.name = name;
    this.color = color;
}

// 封裝繼承函數(shù)
function extend(Child,Parent){
    var F = function(){};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    // 備用性質(zhì)
    Child.uber = Parent.prototype;
    // 等于在子對象上打開一條通道,可以直接調(diào)用父對象的方法,這一行放在這里,只是為了實(shí)現(xiàn)繼承的完整性
}

extend(Cat,Animal);

var cat = new Cat('big','red');

console.log(cat.species);
console.log(Cat.prototype.constructor == Cat);
console.log(Animal.prototype.constructor == Animal);



ES6中的類

// Now
class Point {
   constructor(x, y) {
       this.x = x;
       this.y = y;
   }

   toString() {
       return '(' + this.x + ', ' + this.y + ')';
   }
}
var a = new Point(1,2);
console.log(a.x);                      //1
console.log(a.toString());             //(1,2)

繼承:extends關(guān)鍵字

class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y);                                // 調(diào)用父類的constructor(x, y)
    this.color = color;
  }

  toString() {
    return this.color + ' ' + super.toString(); // 調(diào)用父類的toString()
  }
}

繼承了父類的所有屬性,也可以添加或者修改屬性

14.模塊化

//lib.js
var counter = 3;
function incCounter() {
  counter++;
}
module.exports = {
  counter: counter,
  incCounter: incCounter,
};
// main.js
var mod = require('./lib');

console.log(mod.counter);  // 3
mod.incCounter();
console.log(mod.counter);  // 3

15.Promise---異步

先來看ajax的異步:

$(function(){
    $('#send').click(function(){
         $.ajax({
             type: "GET",
             url: "test.json",
             data: {username:$("#username").val(), content:$("#content").val()},
             dataType: "json",
             success: function(data){
                         $('#resText').empty();   //清空resText里面的所有內(nèi)容
                         var html = ''; 
                         $.each(data, function(commentIndex, comment){
                               html += '<div class="comment"><h6>' + comment['username']
                                         + ':</h6><p class="para"' + comment['content']
                                         + '</p></div>';
                         });
                         $('#resText').html(html);
                      }
         });
    });
});

上面的例子實(shí)現(xiàn)了一個(gè)類似于表單提交的功能。
Promise的異步:

let promise = new Promise(function(resolve, reject) {
  console.log('Promise');                        //實(shí)例化后立即執(zhí)行
  resolve();                                     //任務(wù)(成功)完成
});

promise.then(function() {
  console.log('resolved.');                      //任務(wù)結(jié)束執(zhí)行
});

console.log('Hi!');                              //在實(shí)例化promise的同時(shí),執(zhí)行

顯示順序:"Promise"---"Hi"---"resolved"

可以看出,在promise執(zhí)行的整個(gè)過程中(實(shí)例化到結(jié)束),并沒有阻塞其他外部語句的執(zhí)行,換句話說,其他語句

不用等到輸出"resolved"之后再執(zhí)行。

function loadImageAsync(url) {
  return new Promise(function(resolve, reject) {
    const image = new Image();

    image.onload = function() {
      resolve(image);                        //promise對象狀態(tài)變?yōu)閞esolved
    };

    image.onerror = function() {
      reject(new Error('Could not load image at ' + url));
    };                                       //promise對象狀態(tài)變?yōu)閞ejected并拋出錯(cuò)誤

    image.src = url;
  });
}

注意:上面狀態(tài)改變時(shí)傳入函數(shù)的參數(shù)(image、new Error),會傳到之后then函數(shù),作為then函數(shù)的參數(shù)的參數(shù)?。?!

loadImageAsync(url).then(function(success){
  console.log(success);
} ,function(error){
  console.log(error);
});

這里的success接收來自resolved狀態(tài)的參數(shù)image,error接收來自rejected狀態(tài)的參數(shù)new Error。

事實(shí)上then后面還可以加上一個(gè)catch函數(shù)用來捕捉rejected狀態(tài)產(chǎn)生的錯(cuò)誤,這樣就可以省略掉then函數(shù)里面的第二個(gè)參數(shù)

promise.then(success()).catch(error()).finally(function(){});

16.async函數(shù)

async就表示asynchronous(異步的),async函數(shù)會返回一個(gè)Promise對象,自然能夠調(diào)用其方法:
promise.then(success()).catch(error()).finally(function(){});

async function getStockPriceByName(name) {
    const symbol = await getStockSymbol(name);
    const stockPrice = await getStockPrice(symbol);
    return stockPrice;             //stockPrice是一個(gè)promise對象
}

getStockPriceByName('goog').then(function (result) {
    console.log(result);
});

可以看出,它和一般函數(shù)沒多大區(qū)別,只是多了一個(gè)async標(biāo)識。
注意:上面所說到的返回一個(gè)對象,這個(gè)對象本身沒什么特別,只是他可以作為promise對象,在調(diào)用then方法的時(shí)候作為參數(shù)傳
到函數(shù)里面。而且因?yàn)檫@個(gè)對象會被當(dāng)做promisi對象,return關(guān)鍵字可以替換成await。
Async/await學(xué)習(xí)-luckyzv

17.Vue 與 ES6

  • Vue是什么?

Vue.js(讀音 /vju?/,類似于 view) 是一套構(gòu)建用戶界面的漸進(jìn)式框架。

  • Vue + ES6?
    模塊化開發(fā)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文為阮一峰大神的《ECMAScript 6 入門》的個(gè)人版提純! babel babel負(fù)責(zé)將JS高級語法轉(zhuǎn)義,...
    Devildi已被占用閱讀 2,131評論 0 4
  • 第一章:塊級作用域綁定 塊級聲明 1.var聲明及變量提升機(jī)制:在函數(shù)作用域或者全局作用域中通過關(guān)鍵字var聲明的...
    BeADre_wang閱讀 996評論 0 0
  • [TOC] 參考阮一峰的ECMAScript 6 入門參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,915評論 0 1
  • let ES6新增的用于變量聲明的關(guān)鍵字 通過let聲明的變量,不允許重復(fù)聲明 不支持變量聲明預(yù)解析,let變量,...
    年過古稀的Coder閱讀 384評論 0 1
  • ES6 學(xué)習(xí)筆記,如有錯(cuò)誤,歡迎指正。 筆記只記錄了一些個(gè)人認(rèn)為需要記住的知識點(diǎn)。 參考:ECMAScript 6...
    _1633_閱讀 464評論 1 1

友情鏈接更多精彩內(nèi)容