JavaScript知识点

210 阅读5分钟

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的作用是定义一组具体的对象。