js相关解析

本文围绕JavaScript展开,介绍了this关键字在不同场景下的指向,如方法中指向所有者对象等,还提及apply、call、bind等改变this指向的方法。阐述了异步中的并行和并发概念,以及Promise、async和await的使用。此外,讲解了for…of、for…in等遍历方式,最后分析了闭包的原因和弊端。
			str.substring(start: Number, end: Number)
            //截取字符串从start到end(不包含的字符串)

            str.slice(start: Number, end: Number)
            // 截取字符串从start到end(不包含,可为负数)的字符串

            str.replace(searchValue:{staring, RegExp}, replaceValue: string)
            // 将searchValue 符合条件的替换成replaceValue

            str.split(splitter: string, limit?: Number)
            // 将str根据splitter拆分成长度不大于limit的数组

            str.repeat(count: Number)
            // 将str重复指定的次数,返回重复后的字符串

            arr.toString()
            // 将转换成以逗号分隔的字符串   obj.toString()=> '[object Object]'
            
            Array.from(iterabel: Iterabel<any>)
            // 将可迭代的值转换为以逗号分隔的数组

            arr.join(separator?: string)
            // 将数组分隔成以separator连接的字符串 空则为,

            arr.push()
            // 数组尾部添加元素

            arr.pop()
            // 删除数组尾部元素,返回删除的元素

            arr.unshift()
            // 数组开头添加元素 返回新的长度

            arr.shift()
            // 数组开头删除元素 返回第一个元素

            arr.sort(Function?: (a: any, b:any) => a-b :number )
            // 默认对数组进行升序  b-a执行倒叙
                
            arr.reverse()
            // 颠倒数组中元素的顺序 会改变原数组

            arr.slice(start: Number, end: Number)
            // 返回原数组中指定下标到结束下标直接组成的新数组

            arr.splice(start: number, deleteCount: number,  ...items: any[])
            // start开始操作的位置,deleteCount删除的数量, items进行插入的元素

            arr.forEach(callbackfn:(item, index)=>{})
            // 遍历数组 没有返回值 无法中断(除了throw)

            arr.map(callbackfn: (item,index)=>{})
            // 返回一个新数组 无法中断

            for (const key in object) {
                if (Object.hasOwnProperty.call(object, key)) {
                    const element = object[key];
                    
                }
            }
            // 遍历对象,数组 key值 如果迭代的对象的变量值是null或者undefined, for in不执行循环体

            for (const iterator of object) {
                
            }
            // for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象

this

JavaScript this关键字指的是它所属的对象
它拥有不同的值,具体取决于它的使用位置

  • 在方法中,this指向所有者对象
  • 单独的情况下,this指向的是全局对象
  • 在函数中,this指向的是全局对象
  • 在函数中,严格模式下,this是undefined
  • 在事件中,this指向接收事件的元素

apply: apply(obj,[a,b,c])接受两个参数,第一个参数指定了函数体内this的指向,第二参数是一个数组或类数组,用于传递被调用函数的参数列表

call: call(obj, params, paramsn…) 第一个参数指定了函数体内this的指向,后续参数依次传入

bind: bind和call一样且返回的是函数 bind(obj, params, params…)()

箭头函数:箭头函数没有自己的this,它的this是继承而来;默认指向在定义它时所处的对象(宿主对象),且this指向不能被更改。vue的methods中不能使用箭头函数,因为会导致this指向的不是vue实例$vm,而是一个xxx.a的类

匿名函数: this指向window

setInterval、setTimeout: this指向window

eval: 可计算某个字符串, this指向调用上下问中的this

理解

异步

并行和并发:

  • 并发是宏观概念,我分别有任务A和任务B,在一段时间内通过任务间的切换完成了这两个任务
  • 并行是微观概念,假设cpu有两个内核,那么就可以同时完全任务A、B

Promise:
promise有三个状态:等待着(pending) 完成(resolved)拒绝(rejected)

const promise = new Promise((resolve, reject) => {
    // do something here ...
    if (success) {
        resolve(value); // fulfilled
    } else {
        reject(error); // rejected
    }
});

promise.then(function(value) {
      // success
  }, function(error) {
      // failure
  });

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
}); 

Promise.all([p1, p2, p3]).then(values => { 
  console.log(values); 
});

//  [3, 1337, "foo"] 

async和await:
一个函数如果加上async,那么该函数就会返回一个Promise

async function test() {
 return "1"
}
console.log(test()) // -> Promise {<resolved>: "1"}

async就是将函数返回值使用Promise.resolve()包裹了下,和then中处理返回值一样,并且async必须和await配套使用。
当然也存在一些缺点,因为 await 将异步代码改造成了同步代码,如果多个异步代码没有依赖性却使用了 await 会导致性能上的降低。


async function test() {
 // 以下代码没有依赖性的话,完全可以使用 Promise.all 的方式
 // 如果有依赖性的话,其实就是解决回调地狱的例子了
 await fetch(url)
 await fetch(url1)
 await fetch(url2)
}

setTimeout:延时后执行
setInterval:每隔多久执行

遍历

for…of:可以循环遍历它的成员(属性值),使用范围包括数组、Set和Map结构、某些类似数组的对象,generator对象,以及字符串数组的遍历器接口只返回具有数字索引的属性。对于普通的对象,for…of结构不能直接使用,会报错,必须部署了iterator接口后才能使用。可以中断循环。

for…in:遍历对象自身的和继承的课枚举的属性,不能直接获取属性值。可以中断循环

forEach:只能遍历数组,不能中断,没有返回值,会改变原数组

map:只能遍历数组,不能中断,不会改变原数组返回值是修改后的数组

闭包
原因:函数中能访问全局对象,但是全局环境中访问不了函数内的局部对象。为了实现在全局中能访问到函数内的局部对象。

function f1(){
    n=999;

    function f2(){

// 形成了闭包(函数内部存在着函数)

// this 指向Windows

// 闭包作用:

1.是为了能够访问局部内的变量

2.为了这些变量始终存在内存中(当变量一直被使用时,栈中不会释放掉该内存)
      ;
    }

    return f2;

  }

  var result=f1();

  result(); // 999

弊端:容易造成内存泄露

 function foo(){  // 闭包(函数),提供一个私有的空间。(foo()只调用一次,从而保证共用的私有空间是相同的空间)

            var name = "张三";  //私有空间中的变量。foo()只能调用一次,从而保证多次setName所使用的变量是相同的变量(name)

            var age = 20;

            return {   // 通过return内部函数,可以让外部获取内部函数,并通过内部函数来获取/修改私有空间中的内容。 (如果是多个内部函数,可以将多个内部函数封装成JSON对象返回)

                getName: function () {  //(内部函数) 不带参数表示获取

                    return name;   //获取一定要有return语句。

                },

                setName: function (value) { //(内部函数) 带参数表示设置

                    name = value;

                    return name;  // 设置时可以不用return, 这里的return是为了友好。

                },

                getAge:function(){

                    return age;

                },

                setAge:function (value) {

                    if(value < 0 ){  //设置安全措施,可以保证系统的安全性和稳定性

                        throw "数据非法";

                    }

                    age = value;

                    return age;

                }

            }

        }

 

 

        var obj = foo();  //foo()只调用一次,表示共用的是同一个私有空间(闭包)。 obj就是内部函数(或者多个内部函数封装成的JSON对象)

        console.log(obj.getName());

        obj.setName("高金彪");

        console.log(obj.getName());

        obj.setAge(22);

        console.log(obj.getAge());   //多次设置和获取,都是共用的同一个私有空间
    //闭包的作用

    //最基本的作用:可以通过闭包返回的内部函数或者方法,来修改函数内部的数据

    //创建一个私有的空间,保护数据

    //外部想要访问数据,只能通过函数提供的内部方法

    //在提供的内部方法中,我们可以设置一些校验逻辑,让数据变得更加安全

原文链接:https://blog.youkuaiyun.com/houyanhua1/java/article/details/79843328

Map

const map = new Map([
	['name', '张三'],
	['age', '18']
])

map.size // 2
map.has('name') // true
map.get('name') // 张三
map.has('name') // true
map.set('like', 'basketball') 
map.get('like') // basketabll
map.get('from') // undefined
map.delete('age')
map.has('age') // false

[...map.keys()] // ['name', 'age']
[...map.values()] // ['张三', '18']
[...map.entries()] // [['name','张三'],['age','18']]
[...map] // [['name','张三'],['age','18']]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值