Loading...

# js 基础

# 1. this 的指代

  • 全局环境里的 this->windows
  • 全局函数里的 this->windows
  • 方法中的 this-> 调用该方法的对象
  • 事件里的 this-> 触发该事件的 DOM 对象
  • 构造函数中的 this->new 创建的对象
  • new 关键字做了什么:new 创建对象,将构造函数的 this, 指向创建出来的对象。
  • 箭头函数中 this-> 指向箭头函数上下文的 this

# 2. call、apply、bind 的基本用法

他们三个都是用于修改函数this指向的

但是参数和用法有些区别

fun.call (A, 参数 1,参数 2)

fun.apply (A,[参数 1,参数 2]);

bind 和 call 类似,但是和上面两个的区别是,它改变 this 之后,不会立刻执行,而是返回一个函数,可以多次调用。

应用场景:

  • 防抖、节流的编写
  • 实现多继承等

# 3. 同步和异步

同步:代码顺序执行。

异步:代码的执行顺序可能不是顺序的。
# 3.1 js 为什么是单线程的。
如果是多线程的话,在操作dom的时候就需要相关的措施来防止同时操作。
# 3.2 事件循环、执行顺序相关
  1. 同步
  2. process.nexttick()
  3. 微任务 (promise.then () 方法)
  4. 宏任务 (计时器,ajax,读取文件)。
  5. setImmediate()
# 3.3 promise 和 async

promise 需要用 resolve 函数传出来,传出来的作为 then 的形参,才会执行 then

let p=new Promise((resolve)=>{
	resolve("hello world")
})
p.then((data)=>{
	console.log(data)
})

async 函数的返回一个 promise 对象。其 return=> then 的参数,也可以用 await 获取到

function fun(){
	return new Promise((resolve)=>{
		resolve(1);
	})
}

等价于

async function fun(){
	return 1;
}

await 可以跟上 promise 对象,获取到 resolve 的值

let p=new Promise((resolve)=>{
		resolve(1);
	});
async function fun(){
	let a=await p;
    console.log(a); //1
}

# 4. 对象属性描述

  • configurable 可配置 (是否可 delete)
  • enumerable 可枚举(for in 能否遍历到)
  • value
  • writeable 是否可更改

# 5. 闭包

方便模块化,模块内仅能访问内部函数返回的。,并根据它使用、操作内部的函数方法等。

内部函数没执行完成,变量不会销毁

# 对象拷贝相关

# 5.1 javaScript 的内存结构

(栈内存) 原始类型:数值,字符串,布尔、null、undefined

(堆内存) 引用类型:对象

# 5.2 浅拷贝,通过键值对拷贝
function copy(old){
	let new={};
	for i in old{
		new[i]=old[i];
	}
	return new;
}
# 5.3 深拷贝

方法 1

function copy(old){
	let new={};
	for i in old{
		 if(obj[i] instance of Object){
            new[i]=copy(obj[i]);
        }else{
			new[i]=old[i];
		}
	}
	return new;
}

方法 2,json

let old_json=JSON.stringify();
let new=JSON.parse(old_json);

# 5. 防抖

防抖是防止用户多次触发事件,只保留最后一次触发事件,做法是通过计时器来实现的

function debounce=(fn,delay){
	let t=null;
    if(t!=null){
        clearTimeout(t);
    }
    t=setTimeout(()=>{
        fn.call(this);
    },delay)  
}

# 6. 节流

节流是短时间内多次触发事件,只保留第一次时间,也是通过计时器实现的

function throttle=(fn,delay){
	let flag=true;
    if(flag){
    	setTimeout(()=>{
        	fn.call(this);
        	flag=true;
    	},delay)  
    }
    flag=false;
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

jluyeyu 微信支付

微信支付

jluyeyu 支付宝

支付宝