1. 讲讲js数据类型?基本和引用的区别?symbol和bigint讲一讲应用场景?
基本类型:null,undefined,string,object,boolean,symbol,bigint
引用类型:object,object包括:object,array,function
区别:基本类型是存在栈中的,可以直接访问;引用类型是保存在对内存中的对象;
symbol:Symbol 是一种在ES6 中新添加的数据类型,本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值
bigint:BigInt数据类型提供了一种方法来表示大于2^53-1的整数。BigInt可以表示任意大的整数
2. 判断数据类型的方法?instanceof原理?判断空对象?
基本类型:typeof; 引用类型:instanseOf; 都能判断:Object.property.tostring.call();
instanceof原理:从当前引用的proto一层一层顺着原型链往上找,能否找到对应的prototype。找到了就返回true。
判断空对象:object.keys();
3. var/let/const 区别?暂时性死区?
var:函数作用域,没有块的概念,可以跨块访问, 不能跨函数访问
let:块级作用域,只能在块作用域里访问,不能跨块访问,也不能跨函数访问
const:块级作用域,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改
暂时性死区:在代码快内,使用let命令声明变量之前,该变量都是不可用的
4. 说说你对函数式编程的理解?
函数式编程的目的是 使用函数来抽象作用在数据之上的控制流和操作,从而在系统中消除副作用并减少对状态的改变。(任何执行都是一样的,没有副作用)
5. 防抖、节流的含义,使用场景?手写一下?
频繁调用函数增加一个限制,减少频率
防抖:当函数连续被调用时,函数并不执行,只有当全部停止后超过一定时间后,才会调用
function debounce(){
let timeout;
return function(){
let arg=arguments;
let that=this;
clearTimeout(timeout);
!timeout && fn.apply(that, arg);
timeout=setTimeout(() => {
timeout = null;
}, wait);
}
}
节流:设置时间,一段时间内,只响应一次
function throttle(fn, wait) {
let timeout;
return function () {
if (!timeout) {
timeout = setTimeout(() => {
timeout = null;
fn.apply(this, arguments)
}, wait)
}
}
}
使用场景:input框实时搜索功能
6. call、apply、bind区别?bind实现?bind之后还能修改this指向吗?为什么?
可以修改函数的this指向
call:参数依次传递,立即调用;
apply:第二个参数为数组,立即调用;
bind:参数依次传递,返回对应函数,便于稍后调用;
7. 闭包概念,最主要的还是问闭包的场景?
函数作用域内返回个函数,并且返回的函数使用的函数的变量;模拟私有变量
8. 用es5实现es6类的继承?各种继承问的挺多的
9. 深拷贝与浅拷贝?常用方法?手写一个深拷贝函数?
浅拷贝:创建一个对象,这个对象有着原始属性值的精确拷贝,基本类型拷贝的是基本类型的值,引用来袭拷贝的是内存地址;
- object.agsign();
- lodash的_clone();
- 展开运算符...;
- Array.prototype.concat();
深拷贝:把一个对象完整的从内存中拷贝出来,从内存中开辟出一个新的内存地址存放他,且新对象的引用不会影响原对象;
- JSON.stringify(JSON.parser()),缺点:不能拷贝函数(null)和正则({});
- lodash的_cloneDeep();
- 手下遍历实现
10. 说说你知道的JavaScript设计模式?观察者和发布订阅的区别?
单例模式、策略模式、代理模式、装饰者模式(vue)、发布-订阅模式;
11. 说说对你对JavaScript异步编程的理解?
callback一层一层嵌套;promise;async,awiat;
12. ES Module与 CommonJS 模块的差异?两者互相加载的方式?一般会扯到AMD
AMD:依赖前置,提前加载
CMD:推崇依赖就近,延迟执行
CommonJS的特点:
所有代码都运行在模块作用域,不会污染全局作用域;
模块是同步加载的,即只有加载完成,才能执行后面的操作;
模块在首次执行后就会缓存,再次加载只返回缓存结果,如果想要再次执行,可清除缓存;
ES6 Module的特点(对比CommonJS)
CommonJS模块是运行时加载,ES6 Module是编译时输出接口; CommonJS加载的是整个模块,将所有的接口全部加载进来,ES6 Module可以单独加载其中的某个接口; CommonJS输出是值的拷贝,ES6 Module输出的是值的引用,被输出模块的内部的改变会影响引用的改变; CommonJS this指向当前模块,ES6 Module this指向undefined;
目前浏览器对ES6 Module兼容还不太好,我们平时在webpack中使用的export/import,会被打包为exports/require。
13. Promise.all、race、allSettled 概念?很多手写题都会用到,比如用promise实现请求并发个数限制?
Promise.race(iterable):只看最快的第一个, 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
Promise.all:所有成功才成功,有一个失败,就失败;返回结果为最先的失败的;
Promise.allSettled:所有的结果都返回;
14.面向对象,面向函数
面向对象:针对对象来执行某些动作,这些动作是可以自定义扩展;三大特性:封装、继承、多态
面向过程:定义很多动作,指定谁来执行这个动作;
15.node
是一个基于v8引擎的javascript运行时;
16.typescript里interface和type都有哪些区别呢?
type的作用是给类型生成一个新的别名。
而interface的作用是定义一组具体的对象。