闭包:
闭包通俗来说就是可以在函数外部访问到函数内部的变量。
正常情况下函数外部是访问不到函数内部作用域变量的。
优点:可以隔离作用域,不造成全局污染。
缺点:长期驻留内存,会导致内存泄漏。
如何解决内存泄漏:将暴露外部的闭包变量设置为null。
适用场景:在性能优化的过程中,使用防抖节流,导航栏获取下标使用。
原型链的理解:
主要涉及两点:_proto_,prototype。
__proto__:__proto__指向该对象所在的构造函数的原型对象。
prototype:Person()构造函数的prototype属性是一个对象。
Js的继承:
一、原型链继承,prototype。
二、借用构造函数继承,call或者apply的方式。
三、组合继承,通过以上一条进行合并继承。
es6继承:
通过class来定义类,在用extends来继承类,用super()表示父类。
Js原型事件绑定:
绑定事件已知三种:
1、html事件 :现如今已经不常用,缺点就是不好维护,因为散落在标签中,也就是耦合度太高。
2、DOM0事件:目前常用于pc端用于绑定方式,兼容性好,主要是获取dom元素在添加事件。
优点:兼容性好。
缺点:只支持冒泡,不支持捕获。
3、DOM2事件:移动端运用的较多,提供了专门的绑定和移除方法。
优点:支持给元素绑定多个相同事件,支持冒泡和捕获机制。
ES6新增特性:
es6新增特性常用:let/const,箭头函数,模板字符串,解构赋值,模板导入和导出。promise还有数组字符串的新方法。
js设计模式有哪些:
已知有单例模式和观察者模式。
单例模式:
保证一个类只有一个实例,先判断,存在返回,不存在创建再返回,确保一个类只有一个实例对象。
观察者模式:
所作工作就是在解耦,让耦合的双方都依赖于抽象而不是依赖于具体。
Js面相对象的理解:
通过function来模拟类,prototype实现类方法共享,跟其他语言有本质上的不同,自从有了ES6面向对象更像后端语言的实现了,通过class定义类,extends继承父类,其实ES6实现本质是个语法糖。
Js数组常用方法(8个):
push,pop,join,foreach,map,sort,some,every……【还有其他不在一一介绍,记住几个简单的就好了。】
Js数组内置遍历方法有哪些和区别:
forEach:取代了for循环,一般返回值是undefined。
filter:是一个过滤遍历的方法,如果返回条件true,则返回满足条件为true的新数组。
map:map方法主要对数组的复杂逻辑处理时用的多,特别是react中遍历数组,常用到,写法和foreach相似。
some:方法用于只要数组中至少存在一个满足条件的结果,返回值为true,否则为false,写法和foreach相似。
every:方法用于数组中每一项满足条件时,才会返回true,否则是false,同foreach相似。
Js作用域和作用域链:
Js作用域也就是Js识别变量的范围,作用域链也就是Js查找变量的顺序。
作用域:全局作用域,局部作用域,块级作用域。
全局:也就是在window下的变量范围,在任何地方都可以访问。
局部:只在函数内部定义的变量。
块级:简单来说就是const和let在任意代码块中定义的变量都认为是块级作用域中的变量。(注:尽量不要使用全局变量,因为容易导致全局渲染,命名冲突,对bug查找不利)
作用域链:就是由内部的作用域往最外部,查找变量的过程形成的链条就是作用域。
JS数据类型有哪些:
基本数据类型:number,string,Boolean,null,undefined,symbol(ES6新增)
复合类型:Object,function。
说一下call,apply,bind区别:
call,apply,bind都是this指向,但使用上略有不同。
call:后面传递的参数是以逗号形式分开。
apply:传递的参数是数据形式。
bind:返回的是一个函数形式,如果要执行在加一个小括号。