资讯专栏INFORMATION COLUMN

JavaScript闯关笔记

Jokcy / 535人阅读

摘要:对空数组是不会执行回调函数的。就算改变已经发生了,你再对对象添加回调函数,也会立即得到这个结果。用来表示函数是异步的,定义的函数会返回一个对象,可以使用方法添加回调函数。

介绍

通过Array/Object/Function基础类型编写。

看到自己不了解的或者比较新颖的用法便会写上。

不定时更新内容。

本文首发于我的个人网站: Timbok.top
目录

Array

迭代方法

split和join

Object

object映射

Function

promise

async-await

Array 迭代方法

every()方法对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true

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

some()方法 对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true

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

filter()方法对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组

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

map()方法 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组

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

forEach()方法 对数组中的每一项运行给定函数。这个方法没有返回值,本质上与使用 for 循环迭代数组一样

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

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。对空数组是不会执行回调函数的。

arr.reduce(callback,[initialValue])

callback (执行数组中每个值的函数,包含四个参数)

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

currentValue (数组中当前被处理的元素)

index (当前元素在数组中的索引)

array (调用 reduce 的数组)

initialValue (作为第一次调用 callback 的第一个参数。)

无返回值

const arr = [1, 2, 3];
arr.reduce((pev, item)=>{
    console.log(pev, item);
}, 0);
// 运行结果依次为: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运行结果依次为:0, 1, 3, 6
split和join

split(): 用于把一个字符串分割成字符串数组。

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

如果string为空,则返回一个空数组

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

join(): 用于把数组中的所有元素放入一个字符串。

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

定义一个object作为配置对象来存放不同状态,通过链表查找

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

这样比较清晰,将条件配置与具体执行分离。如果要增加其他状态,只修改配置对象即可。

Function promise

ECMAscript 6 原生提供了 Promise 对象。

Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。

Promise 对象有以下两个特点:

1、对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:

pending: 初始状态,不是成功或失败状态。

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

rejected: 意味着操作失败。

只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是「承诺」,表示其他手段无法改变。

2、一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

简单实现:

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

_promise(-1).catch(res=>console.log(res)) // 负数
Promise.all

Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

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获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的,即p1的结果在前,即便p1的结果获取的比p2要晚。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题。

Promise.race

顾名思义,Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

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)  // 打开的是 "failed"
})
async-await

ES2017 标准引入了async 函数,使得异步操作变得更加方便。

async 函数是什么?一句话,它其实就是promiseGenerator 函数的语法糖。

async

async 用来表示函数是异步的,定义的函数会返回一个promise对象,可以使用then方法添加回调函数。

async function test() {
    return 123;
}

test().then(res => {
    console.log(res);// 123
});
若 async 定义的函数有返回值,return 123;相当于Promise.resolve(123),没有声明式的 return则相当于执行了Promise.resolve();
await

await 可以理解为是 async wait 的简写。await 必须出现在 async 函数内部,不能多带带使用。

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

await 后面可以跟任何的JS 表达式。虽然说 await 可以等很多类型的东西,但是它最主要的意图是用来等待 Promise 对象的状态被 resolved。如果await的promise对象会造成异步函数停止执行并且等待 promise 的解决,如果等的是正常的表达式则立即执行。

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);// 两秒之后会被打印出来
}
awaitDemo();
// normalFunc
// VM4036:13 something, ~~
// VM4036:15  enough sleep~

希望通过上面的 demo,大家可以理解我上面的话。

错误处理

上述的代码好像给的都是resolve的情况,那么reject的时候我们该如何处理呢?

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 的情况我们应该将代码块用 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 回来的数据了。

最后一点,await必须在async函数的上下文中的。

参考文章

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102030.html

相关文章

  • JavaScript 闯关

    摘要:对象数组初始化表达式,闯关记之上文档对象模型是针对和文档的一个。闯关记之数组数组是值的有序集合。数组是动态的,根闯关记之语法的语法大量借鉴了及其他类语言如和的语法。 《JavaScript 闯关记》之 DOM(下) Element 类型 除了 Document 类型之外,Element 类型就要算是 Web 编程中最常用的类型了。Element 类型用于表现 XML 或 HTML 元素...

    mj 评论0 收藏0
  • JavaScript 闯关记》

    摘要:本课程之所以叫做闯关记,是因为部分章节精心设计了挑战关卡,通过提供更多的实战机会,让大家可以循序渐进地有目的地有挑战地开展学习。课程结构及目录以下目录只是初步构想,课程结构及内容会根据实际情况随时进行调整。 为何写作此课程 stone 主要负责基于 Web 的企业内部管理系统的开发,虽然能够熟练地使用 JavaScript,但随着对 JavaScript 的理解越来越深,才发现自己尚...

    curried 评论0 收藏0
  • 前端技术能力大比拼(第五期)

    摘要:活动奖励本次活动计划评出前三名,均为葡萄城定制奖品第一名葡萄城定制马克杯第二名葡萄城定制魔方第三名葡萄城定制笔记本中性笔 参赛条件 不限人群,只要加入前端技术交流群(720389894),都可进行在线答题showImg(https://segmentfault.com/img/bVbqcUi?w=798&h=300); 活动流程 1、 在线答题:详情见下方活动方式2、 题目...

    zhangke3016 评论0 收藏0
  • 前端技术能力大比拼(第五期)

    摘要:活动奖励本次活动计划评出前三名,均为葡萄城定制奖品第一名葡萄城定制马克杯第二名葡萄城定制魔方第三名葡萄城定制笔记本中性笔 参赛条件 不限人群,只要加入前端技术交流群(720389894),都可进行在线答题showImg(https://segmentfault.com/img/bVbqcUi?w=798&h=300); 活动流程 1、 在线答题:详情见下方活动方式2、 题目...

    jerryloveemily 评论0 收藏0
  • JavaScript 闯关记》之初探

    摘要:使用元素嵌入代码时,只需为指定属性。需要注意的是,带有属性的元素不应该在其和元素之间再包含额外的代码。在包含外部文件时,必须将属性设置为指向相应文件的。所有元素都会按照他们在页面中出现的先后顺序依次被解析。关注,获取最新动态。 当学习一门新的编程语言的时候,应该边学边做,反复演练以加深理解。因此,你需要一个 JavaScript 解释器。幸运的是,每一个 Web 浏览器都包含一个 Ja...

    atinosun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<