1.js的基础类型有什么?
基础类型有:null,NaN,string,number,boolean,bigint,symbol,undefine
引用类型有:object,Array,function
2.tyopef和instanceof的区别:
1.typeof可以识别所有的值类型,识别函数,能区分是否是引用类型
const a="str" console.log(typeof a) //string
const b=999 console.log(typeof b) //number
const c=BigInt(9999999999999) console.log(typeof c) // BigInt
const d= undefine console.log(typeof d) //undefine
const e=false console.log(typeof e) //boolean
const f=Symbol console.log(typeof f) //symbol
const g=null console.log(typeof g) //object
instanceof用于检测构造函数的prototype属性是否出现在某个对象实例上
3.数组的map方法和foreach方法有哪些区别?常用哪些方法去对数组进行增删改查
forEach是对数组的每一个元素执行一次给定的函数
map是创建一个新数组,该数组由原数组的每个元素都调用一次提供的函数返回的值
pop():删除数组后面的最后一个元素,返回被删除的那个元素
push():讲一个或者多个元素添加到数组的末尾,并返回数组的长度
shift():删除数组的第一个元素,返回被删除元素的值
splice():通过删除或者替换现有元素添加到数组的开头,并返回该数组的长度
reverse():反转数组
4.闭包和作用域
闭包是作用域应用的特殊场景,js中常见的作用域包括全局作用域,函数作用域,块级作用域。
js中自由变量的查找是在函数定义的地方向上级作用域查找,不是在执行的地方。常见的闭包使用有两种场景:一种是函数作为参数被传递;一种是函数作为返回值被返回
// 函数作为返回值
function create() {
let a = 100;
return function () {
console.log(a);
};
}
const fn = create();
const a = 200;
fn(); // 100
// 函数作为参数被传递
function print(fb) {
const b = 200;
fb();
}
const b = 100;
function fb() {
console.log(b);
}
print(fb); // 100
5.实现一个类似关键字new功能的函数
在js中new关键字主要做了如下几点工作:
1.创建一个空对象,这个对象会作为执行new函数之后返回的对象实例
2.将穿件的空对象原型(_proto_)指向构造函数的prototype属性,同时将这个空对象给构造函数内部的this
3.执行构造函数逻辑,根据构造函数的执行逻辑,返回初始创建的对象或构造函数的显式返回值
function newFn(...rags){
const constructor = args.shift();
const obj = Object.create(constructor.prototype);
const result = constructor.apply(obj,args);
return typeof result === "object" && result !== null?result:obj
}
function Person(name){
this.name = name;
}
const p = newFn(Person,"Jerome");
console.log(p.name)
6.箭头函数和普通函数有什么区别
箭头函数不会创建自身的this,只会从上一级继承this,箭头函数的this在定义的时候就已经确认了,之后不会改变,同时箭头函数无法作为构造函数使用,没有自身的prototype,也没有arguments
7.迭代器(iterator)接口和生成器(generator)函数的关系
任意一个对象实现了遵守迭代器协议的[Symbol.iterator]方法,那么该对象就可以调用[Symbol.iterator]返回一个遍历器对象。生成器函数就是遍历器生成函数,故可以把generator赋值给对象的[Symbol.iterator]属性,从而使该对象具有迭代器接口。 8.浏览器的事件循环机制首先要知道一件事,JavaScript是单线程的(指的是js引擎在执行代码的时候只有一个主线程,每次只能干一件事),同时还是非阻塞运行的(执行异步任务的时候,会先挂起相应任务,待异步返回结果再执行回调),这就要知道其事件的循环机制才能正确理解js代码的执行顺序。
在js代码执行时,会将对象存在堆(heap)中,在栈(stack)中存放一些基础类型变量和对象的指针。在执行方法时,会根据当前方法的执行上下文,来进行一个执行。对于普通函数就是正常的入栈出栈即可,涉及到异步任务的时候,js执行会将对应的任务放到事件队列中(微任务队列、宏任务队列)。
- 常见微任务:queueMicrotask、Promise、MutationObserve等。
- 常见宏任务:ajax、setTimeout、setInterval、script(js整体代码)、IO操作、UI交互、postMessage等。
故事件循环可以理解为是一个桥梁,连接着应用程序的js和系统调用之间的通道。其过程为:
- 执行一个宏任务(一般为一段script),若没有可选的宏任务,就直接处理微任务。
- 执行中遇到微任务,就将其添加到微任务的任务队列中。
- 执行中遇到宏任务,就将其提交到宏任务队列中。
- 执行完当前执行的宏任务后,去查询当前有无需要执行的微任务,有就执行
- 检查渲染,若需要渲染,浏览器执行渲染任务
- 渲染完毕后,Js线程会去执行下一个宏任务。。。(如此循环)