JS大杂烩

2021-01-15  本文已影响0人  小艾咪

JS大杂烩

记录自己总是记不住的那些函数用法,和使用规则。

数组篇

遍历

for循环遍历

var arr = [1, 2, 3, 4, 5]
for (let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}

forEach()遍历

forEach回调内接收三个参数,依次为当前元素,当前元素索引,被遍历数组本身

var arr = [1, 2, 3, 4, 5]
arr.forEach((item,index,self)=>{
    console.log(item,index,self);
})

说明:forEach不支持breakcontinue即使是return也只是结束当前回调并不会结束forEach()

删除

删除指定元素

删除指定元素需要先确定被删除元素位置即调用indexOf()函数或缺被删除元素的位置,然后使用slpice()删除该元素。

splice()函数的作用是向数组指定位置添加一个或多个元素,添加的元素会覆盖原位置的元素,所以当不指定添加元素时可用来删除元素。

var arr = [1, 2, 3, 4, 5]
let index = arr.indexOf(4)
arr.splice(index,1)
console.log(arr);

说明:splice()会改变原数组内容,并且在vue中不会触发ui刷新

过滤

过滤数组元素

过滤使用filter()函数

var arr = [1, 2, 3, 4, 5]
var res = arr.filter(item=>{
    return item>3
})
console.log(res);

排序

数组排序

JS数组排序是按照数组内元素的Unicode码来排序的,排序方法是sort()

var arr=[1,4,2,6,3,6,7]
arr.sort()
console.log(arr);
//result (7) [1, 2, 3, 4, 6, 6, 7]

如果排序元素为对象则调用其toString()方法进行排序。

//首先重写toString()方法以按照我们的意愿进行排序
function Person(name){
    this.name=name
    this.toString=function(){
        return this.name
    }
}
var arr=[new Person("C"),new Person("A"),new Person("B"),new Person("D")]
arr.sort()
console.log(arr);
//result (4) [Person, Person, Person, Person]
//      0: Person {name: "A", toString: ƒ}
//      1: Person {name: "B", toString: ƒ}
//      2: Person {name: "C", toString: ƒ}
//      3: Person {name: "D", toString: ƒ}

sort()函数还可以接收一个函数类型参数作为排序依据。但是返回值并不是true/false而是-1/0/1

function Person(name) {
    this.name = name
}
var arr = [new Person("C"), new Person("A"), new Person("B"), new Person("D")]
arr.sort((a, b) => {
    if (a.name > b.name) {
        return 1
    } else if (a.name < b.name) {
        return -1
    } else {
        return 0
    }
})
console.log(arr);
//result(4) [Person, Person, Person, Person]
//      0: Person {name: "A"}
//      1: Person {name: "B"}
//      2: Person {name: "C"}
//      3: Person {name: "D"}

原型篇

JS中每个对象都有一个__proto__属性(Object对象的__proto__属性=null),它指向另一个对象,可已从当前对象中直接调用__proto__所指对象的属性和方法。

JS通过原型链来实现面向对象编程思想中的继承关系。还有一个重要概念prototype __proto__prototype 在某些情况下这两个参数会等于同一对象。通常情况下__proto__针对实例来说,而prototype 针对类来说。

所有显示创建的对象的__proto__都是Object,通过new关键字创建的__proto__是创建该实例的构造函数的prototype(在JS中函数也可是对象)。

var student = {
    name:"wxm",
    age:18
}
function Person(name,age){
    this.name=name
    this.age=age
}
var person = new Person("wxm",18)

//上文说过Object的.__proto__=null,证明显示创建的对象的__proto__为Object
console.log(student.__proto__.__proto__); //result null
//证明通过new关键字创建的实例的__proto__是创建该实例的构造函数的prototype
console.log(person.__proto__ == Person.prototype); //result true

Promise篇

Promise 是一个对象,它代表了一个异步操作的最终完成或者失败。能够解决传统JS异步编程中回调地狱的问题。

创建Promise对象

创建一个Promise对象并为其提供一个函数类型的参数,创建后该函数参数立即执行。

var promise = new Promise((resolve,reject)=>{
    console.log("Promise creating");
})
//result: Promise creating

Promise.then()的使用

Promise创建后调用then([successCallBack],[failCallback])为异步操作设置回调函数,该方法接收两个参数,第一个参数为异步操作成功的回调,第二个为异步操作失败的回调,并且这连个参数都是可选参数。

//异步操作成功演示
var promise = new Promise((resolve, reject) => {
    console.log("Promise creating");
    setTimeout(() => {
        console.log("Already time out");
        resolve()
    }, 3000)
})
promise.then(
    () => {
        console.log("Success function has been executed");
    },
    () => {
        console.log("Fail function has been executed");
    })
//result:   Promise creating
//          Already time out
//          Success function has been executed
//异步操作失败演示
var promise = new Promise((resolve, reject) => {
    console.log("Promise creating");
    setTimeout(() => {
        console.log("Already time out");
        // resolve()
        reject()
    }, 3000)
})
promise.then(
    () => {
        console.log("Success function has been executed");
    },
    () => {
        console.log("Fail function has been executed");
    })
//result:   Promise creating
//          Already time out
//          Fail function has been executed

关于then()中的回调函数的说明

一下内容节选自链接

当一个Promise完成(fulfilled)或者失败(rejected)时,返回函数将被异步调用(由当前的线程循环来调度完成)。具体的返回值依据以下规则返回。如果 then 中的回调函数:

//针对上文做部分验证。
var promise = new Promise((resolve, reject) => {
    console.log("Promise creating");
    resolve()
})
function firstChain(){
    console.log("链式第一链,running");
    return "第一链"
}
function secondChain(param){
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log("第二链Promise异步执行完成");
            param+="+第二链"
            console.log(param);
            resolve(param)
        }, 1000)
    })
}
function thridChain(param){
    console.log("链式调用最后一链,running");
    param+="+第三链"
    console.log(param);
}
promise
    .then(firstChain)
    .then(secondChain)
    .then(thridChain)
//result:   Promise creating
//          链式第一链,running
//          第二链Promise异步执行完成
//          第一链+第二链
//          链式调用最后一链,running
//          第一链+第二链+第三链

待补充

//----------------------------------

最后


大幻梦森罗万象狂气断罪眼\ (•◡•) /

上一篇下一篇

猜你喜欢

热点阅读