国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript闖關(guān)筆記

Jokcy / 537人閱讀

摘要:對(duì)空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。就算改變已經(jīng)發(fā)生了,你再對(duì)對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。用來(lái)表示函數(shù)是異步的,定義的函數(shù)會(huì)返回一個(gè)對(duì)象,可以使用方法添加回調(diào)函數(shù)。

介紹

通過(guò)Array/Object/Function基礎(chǔ)類型編寫。

看到自己不了解的或者比較新穎的用法便會(huì)寫上。

不定時(shí)更新內(nèi)容。

本文首發(fā)于我的個(gè)人網(wǎng)站: Timbok.top
目錄

Array

迭代方法

split和join

Object

object映射

Function

promise

async-await

Array 迭代方法

every()方法對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回 true,則返回 true

const arr = [1,2,3,4];
const result = arr.every((item, index, arr)=>{
    return item > 2;
});
console.log(result); // false

some()方法 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)任一項(xiàng)返回 true,則返回 true

const arr = [1, 2, 3, 4];
const result = arr.some((item, index, arr)=>{
    return item > 2;
});
console.log(result); // true

filter()方法對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回該函數(shù)會(huì)返回 true 的項(xiàng)組成的數(shù)組

const arr = [1, 2, 3, 4];
const result = arr.filter((item, index)=>{
    return item > 2;
});
console.log(result); // [3, 4]

map()方法 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組

const arr = [1, 2, 3, 4];
const result = arr.map((item, index)=>{
    return item * index;
});
console.log(result); // [0, 2, 6, 12]

forEach()方法 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)。這個(gè)方法沒(méi)有返回值,本質(zhì)上與使用 for 循環(huán)迭代數(shù)組一樣

const arr = [1, 2, 3, 4];
const result = arr.forEach((item, index)=>{
    // 執(zhí)行某些操作
});

reduce() 方法接收一個(gè)函數(shù)作為累加器,數(shù)組中的每個(gè)值(從左到右)開(kāi)始縮減,最終計(jì)算為一個(gè)值。對(duì)空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。

arr.reduce(callback,[initialValue])

callback (執(zhí)行數(shù)組中每個(gè)值的函數(shù),包含四個(gè)參數(shù))

previousValue (上一次調(diào)用回調(diào)返回的值,或者是提供的初始值(initialValue))

currentValue (數(shù)組中當(dāng)前被處理的元素)

index (當(dāng)前元素在數(shù)組中的索引)

array (調(diào)用 reduce 的數(shù)組)

initialValue (作為第一次調(diào)用 callback 的第一個(gè)參數(shù)。)

無(wú)返回值

const arr = [1, 2, 3];
arr.reduce((pev, item)=>{
    console.log(pev, item);
}, 0);
// 運(yùn)行結(jié)果依次為:0 1; undefined 2; undefined 3; 

有返回值

// pev為上次迭代return的值
const arr = [1, 2, 3, 4];
const result = arr.reduce((pev, item)=>{
    console.log(pev);
    return pev + item;
}, 0);
console.log(result); // 10
// pev運(yùn)行結(jié)果依次為:0, 1, 3, 6
split和join

split(): 用于把一個(gè)字符串分割成字符串?dāng)?shù)組。

const string = "1, 2, 3, 4, 5";
string.split(","); // ["1", "2", "3", "4", "5"]

如果string為空,則返回一個(gè)空數(shù)組

const string = "";
string.split(","); // [""]
string.split(); // [""]

join(): 用于把數(shù)組中的所有元素放入一個(gè)字符串。

const array = [1, 2, 3, 4, 5];
array.join(); // "1,2,3,4,5" 默認(rèn)用,分割
array.join("|"); // "1|2|3|4|5" 默認(rèn)用,分割
Object object映射

定義一個(gè)object作為配置對(duì)象來(lái)存放不同狀態(tài),通過(guò)鏈表查找

const statusMap = {
    1:()=>{
        console.log("a1")
    },
    2:()=>{
        console.log("b2")
    }
    /* n.... */
}
// 執(zhí)行
let a = 1 
statusMap[a]() // a1

這樣比較清晰,將條件配置與具體執(zhí)行分離。如果要增加其他狀態(tài),只修改配置對(duì)象即可。

Function promise

ECMAscript 6 原生提供了 Promise 對(duì)象。

Promise 對(duì)象代表了未來(lái)將要發(fā)生的事件,用來(lái)傳遞異步操作的消息。

Promise 對(duì)象有以下兩個(gè)特點(diǎn):

1、對(duì)象的狀態(tài)不受外界影響。Promise 對(duì)象代表一個(gè)異步操作,有三種狀態(tài):

pending: 初始狀態(tài),不是成功或失敗狀態(tài)。

fulfilled: 意味著操作成功完成。

rejected: 意味著操作失敗。

只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無(wú)法改變這個(gè)狀態(tài)。這也是 Promise 這個(gè)名字的由來(lái),它的英語(yǔ)意思就是「承諾」,表示其他手段無(wú)法改變。

2、一旦狀態(tài)改變,就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果。Promise 對(duì)象的狀態(tài)改變,只有兩種可能:從 Pending 變?yōu)?Resolved 和從 Pending 變?yōu)?Rejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會(huì)再變了,會(huì)一直保持這個(gè)結(jié)果。就算改變已經(jīng)發(fā)生了,你再對(duì) Promise 對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯(cuò)過(guò)了它,再去監(jiān)聽(tīng),是得不到結(jié)果的。

簡(jiǎn)單實(shí)現(xiàn):

function _promise(params) {
  return new Promise((resolve, reject)=>{
    params>0 ? resolve("正數(shù)") : reject("負(fù)數(shù)");
  });
}
_promise(1).then(res=>console.log(res)) // 正數(shù)

_promise(-1).catch(res=>console.log(res)) // 負(fù)數(shù)
Promise.all

Promise.all可以將多個(gè)Promise實(shí)例包裝成一個(gè)新的Promise實(shí)例。同時(shí),成功和失敗的返回值是不同的,成功的時(shí)候返回的是一個(gè)結(jié)果數(shù)組,而失敗的時(shí)候則返回最先被reject失敗狀態(tài)的值。

let p1 = new Promise((resolve, reject) => {
  resolve("成功了")
})

let p2 = new Promise((resolve, reject) => {
  resolve("success")
})

let p3 = Promise.reject("失敗")

Promise.all([p1, p2]).then((result) => {
  console.log(result)               //["成功了", "success"]
}).catch((error) => {
  console.log(error)
})

Promise.all([p1,p3,p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)      // "失敗"
})

需要特別注意的是,Promise.all獲得的成功結(jié)果的數(shù)組里面的數(shù)據(jù)順序和Promise.all接收到的數(shù)組順序是一致的,即p1的結(jié)果在前,即便p1的結(jié)果獲取的比p2要晚。這帶來(lái)了一個(gè)絕大的好處:在前端開(kāi)發(fā)請(qǐng)求數(shù)據(jù)的過(guò)程中,偶爾會(huì)遇到發(fā)送多個(gè)請(qǐng)求并根據(jù)請(qǐng)求順序獲取和使用數(shù)據(jù)的場(chǎng)景,使用Promise.all毫無(wú)疑問(wèn)可以解決這個(gè)問(wèn)題。

Promise.race

顧名思義,Promse.race就是賽跑的意思,意思就是說(shuō),Promise.race([p1, p2, p3])里面哪個(gè)結(jié)果獲得的快,就返回那個(gè)結(jié)果,不管結(jié)果本身是成功狀態(tài)還是失敗狀態(tài)。

let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("success")
  },1000)
})

let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("failed")
  }, 500)
})

Promise.race([p1, p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)  // 打開(kāi)的是 "failed"
})
async-await

ES2017 標(biāo)準(zhǔn)引入了async 函數(shù),使得異步操作變得更加方便。

async 函數(shù)是什么?一句話,它其實(shí)就是promiseGenerator 函數(shù)的語(yǔ)法糖。

async

async 用來(lái)表示函數(shù)是異步的,定義的函數(shù)會(huì)返回一個(gè)promise對(duì)象,可以使用then方法添加回調(diào)函數(shù)。

async function test() {
    return 123;
}

test().then(res => {
    console.log(res);// 123
});
若 async 定義的函數(shù)有返回值,return 123;相當(dāng)于Promise.resolve(123),沒(méi)有聲明式的 return則相當(dāng)于執(zhí)行了Promise.resolve();
await

await 可以理解為是 async wait 的簡(jiǎn)寫。await 必須出現(xiàn)在 async 函數(shù)內(nèi)部,不能多帶帶使用。

function notAsyncFunc() {
    await Math.random();
}
notAsyncFunc();//Uncaught SyntaxError: Unexpected identifier

await 后面可以跟任何的JS 表達(dá)式。雖然說(shuō) await 可以等很多類型的東西,但是它最主要的意圖是用來(lái)等待 Promise 對(duì)象的狀態(tài)被 resolved。如果await的promise對(duì)象會(huì)造成異步函數(shù)停止執(zhí)行并且等待 promise 的解決,如果等的是正常的表達(dá)式則立即執(zhí)行。

function sleep(second) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(" enough sleep~");
        }, second);
    })
}
function normalFunc() {
    console.log("normalFunc");
}
async function awaitDemo() {
    await normalFunc();
    console.log("something, ~~");
    let result = await sleep(2000);
    console.log(result);// 兩秒之后會(huì)被打印出來(lái)
}
awaitDemo();
// normalFunc
// VM4036:13 something, ~~
// VM4036:15  enough sleep~

希望通過(guò)上面的 demo,大家可以理解我上面的話。

錯(cuò)誤處理

上述的代碼好像給的都是resolve的情況,那么reject的時(shí)候我們?cè)撊绾翁幚砟兀?/p>

function sleep(second) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject("want to sleep~");
        }, second);
    })
}

async function errorDemo() {
    let result = await sleep(1000);
    console.log(result);
}
errorDemo();// VM706:11 Uncaught (in promise) want to sleep~

// 為了處理Promise.reject 的情況我們應(yīng)該將代碼塊用 try catch 包裹一下
async function errorDemoSuper() {
    try {
        let result = await sleep(1000);
        console.log(result);
    } catch (err) {
        console.log(err);
    }
}

errorDemoSuper();// want to sleep~
// 有了 try catch 之后我們就能夠拿到 Promise.reject 回來(lái)的數(shù)據(jù)了。

最后一點(diǎn),await必須在async函數(shù)的上下文中的。

參考文章

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/102030.html

相關(guān)文章

  • JavaScript 闖關(guān)

    摘要:對(duì)象數(shù)組初始化表達(dá)式,闖關(guān)記之上文檔對(duì)象模型是針對(duì)和文檔的一個(gè)。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動(dòng)態(tài)的,根闖關(guān)記之語(yǔ)法的語(yǔ)法大量借鑒了及其他類語(yǔ)言如和的語(yǔ)法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素...

    mj 評(píng)論0 收藏0
  • JavaScript 闖關(guān)記》

    摘要:本課程之所以叫做闖關(guān)記,是因?yàn)椴糠终鹿?jié)精心設(shè)計(jì)了挑戰(zhàn)關(guān)卡,通過(guò)提供更多的實(shí)戰(zhàn)機(jī)會(huì),讓大家可以循序漸進(jìn)地有目的地有挑戰(zhàn)地開(kāi)展學(xué)習(xí)。課程結(jié)構(gòu)及目錄以下目錄只是初步構(gòu)想,課程結(jié)構(gòu)及內(nèi)容會(huì)根據(jù)實(shí)際情況隨時(shí)進(jìn)行調(diào)整。 為何寫作此課程 stone 主要負(fù)責(zé)基于 Web 的企業(yè)內(nèi)部管理系統(tǒng)的開(kāi)發(fā),雖然能夠熟練地使用 JavaScript,但隨著對(duì) JavaScript 的理解越來(lái)越深,才發(fā)現(xiàn)自己尚...

    curried 評(píng)論0 收藏0
  • 前端技術(shù)能力大比拼(第五期)

    摘要:活動(dòng)獎(jiǎng)勵(lì)本次活動(dòng)計(jì)劃評(píng)出前三名,均為葡萄城定制獎(jiǎng)品第一名葡萄城定制馬克杯第二名葡萄城定制魔方第三名葡萄城定制筆記本中性筆 參賽條件 不限人群,只要加入前端技術(shù)交流群(720389894),都可進(jìn)行在線答題showImg(https://segmentfault.com/img/bVbqcUi?w=798&h=300); 活動(dòng)流程 1、 在線答題:詳情見(jiàn)下方活動(dòng)方式2、 題目...

    zhangke3016 評(píng)論0 收藏0
  • 前端技術(shù)能力大比拼(第五期)

    摘要:活動(dòng)獎(jiǎng)勵(lì)本次活動(dòng)計(jì)劃評(píng)出前三名,均為葡萄城定制獎(jiǎng)品第一名葡萄城定制馬克杯第二名葡萄城定制魔方第三名葡萄城定制筆記本中性筆 參賽條件 不限人群,只要加入前端技術(shù)交流群(720389894),都可進(jìn)行在線答題showImg(https://segmentfault.com/img/bVbqcUi?w=798&h=300); 活動(dòng)流程 1、 在線答題:詳情見(jiàn)下方活動(dòng)方式2、 題目...

    jerryloveemily 評(píng)論0 收藏0
  • JavaScript 闖關(guān)記》之初探

    摘要:使用元素嵌入代碼時(shí),只需為指定屬性。需要注意的是,帶有屬性的元素不應(yīng)該在其和元素之間再包含額外的代碼。在包含外部文件時(shí),必須將屬性設(shè)置為指向相應(yīng)文件的。所有元素都會(huì)按照他們?cè)陧?yè)面中出現(xiàn)的先后順序依次被解析。關(guān)注,獲取最新動(dòng)態(tài)。 當(dāng)學(xué)習(xí)一門新的編程語(yǔ)言的時(shí)候,應(yīng)該邊學(xué)邊做,反復(fù)演練以加深理解。因此,你需要一個(gè) JavaScript 解釋器。幸運(yùn)的是,每一個(gè) Web 瀏覽器都包含一個(gè) Ja...

    atinosun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<