js中的继承
- 原型链继承
- 借用构造函数(经典继承)
- 组合继承
- 原型式继承
- 寄生式继承
- 寄生组合继承
1.1-事件委托面试点
-
什么是事件委托
给父元素注册事件,委托给子元素处理 -
事件委托原理:
事件冒泡 -
事件委托注意点
this:指向父元素
e.target:指向触发事件的子元素 -
事件委托场景 :
给动态新增元素注册委托事件
1.2-localStorage与sessionStorage区别
-
相同点:
作用一致:用于存储数据
都是只能存储字符串类型数据(上限5MB) -
不同点: 存储方式不同
localStorage:硬盘存储(永久存储,页面关闭还在,存在硬盘)
sessionStorage:内存存储(临时存储,页面关闭了就消失) -
localStorage与sessionStorage如何存储引用类型数据(数组和对象)
转json存储
1.1-new关键字做了哪些事情
- 创建空对象
- this指向这个对象
- 给对象赋值
- 返回实例对象
1.2-原型链相关
- 原型链作用:面向对象继承
- 对象访问原型链规则:就近原则
先访问自己,自己没有找原型,原型没有找原型的原型,直到原型链终点。 如果还找不到,属性则获取undefined,方法则报错xxx is not defined
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去
它的__proto__隐式原型上查找,即它的构造函数的 prototype,如果还没有找到就会再在
构造函数的 prototype 的__proto__中查找,这样一层一层向上查找就会形成一个链式结
构,我们称为原型链。
1.3-如何判断this指向
this:谁调用我,我就指向谁
普通函数 函数名():window
对象方法 对象名.方法名():对象
构造函数 new 函数名():new创建的实例对象
1.4-call apply bind区别
- 共同点:
- 都可以修改this,第一个参数都是
修改的this
- 都可以修改this,第一个参数都是
- 不同点
- 传参方式不同: call是逐一传参, apply是数组/伪数组传参
- 函数名.call(修改的this,参数1,参数2…)
- 函数名.apply(修改的this,数组/伪数组)
- 执行机制不同:call和apply会立即执行函数,bind不会立即执行
- bind会得到一个修改this后的新函数
- 传参方式不同: call是逐一传参, apply是数组/伪数组传参
1.5-如何判断数据类型
-
- typeof有两种数据类型无法检测: null 、array
-
- Object.prototype.toString.call(数据)
1.6-闭包
- 1.闭包是什么 :
- 闭包 是 使用其他函数内部变量的 函数 (闭包 = 函数 + 其他函数内部变量)
- 闭包 = 函数 + 上下文引用
- 2.闭包作用 : 解决全局变量污染
我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
1.7-递归及应用场景
- 1.递归 : 在函数内部调用自己
- 2.递归作用 :
- 浅拷贝与深拷贝
- 遍历dom树
1.8-浅拷贝与深拷贝
- 1.浅拷贝:拷贝地址, 修改拷贝后的数据原数据也会变化
- 2.深拷贝:拷贝数据, 修改拷贝后的数据原数据不会变化
- 推荐 json : let obj = JSON.parse( JSON.stringify( 对象 ) )
- 递归
1.9-数组常用迭代方法
1.数组map遍历:
-
map方法作用: 根据某种规则映射数组,得到映射之后的新数组
说人话: 按照某种规则,对数组每一个元素进行处理
应用场景 : (1)数组中所有的元素 * 0.8 (2)将数组中的js对象 隐射成 html字符串 -
map语法特点 :
(1) 回调执行次数 == 数组长度 (2) 回调函数内部return return 新元素 如果没有return, 新元素是undefined (3) 方法自身的返回值 映射后的新数组
2.数组filter遍历:
-
filter方法作用: 根据条件,筛选数组
应用场景 : (1)筛选数组中的偶数 (2)商品价格筛选 -
filter语法特点 :
(1) 回调执行次数 == 数组长度 (2) 回调函数内部return return true : 满足筛选条件,放入新数组中 return false : 不满足筛选条件,不放入新数组中 (3) 方法自身的返回值 筛选之后的新数组
3.数组forEach遍历
-
forEach方法作用: 相当于 for循环另一种写法
应用场景 : 遍历数组 -
forEach语法特点 :
(1) 回调执行次数 == 数组长度 (2) 回调函数内部return 无 (3) 方法自身的返回值 无
4.数组some遍历
-
some方法作用: 判断 数组中是否有满足条件的元素 (逻辑或 ||, 有任意一个满足即可)
应用场景 : (1)判断数组中有没有奇数
(2)非空判断 : 判断表单数组中,有没有元素value为空 -
some语法特点 :
(1) 回调执行次数 != 数组长度 (2) 回调函数内部return return true * 循环结束。 找到满足条件的元素, some自身返回true return false : * 循环继续。没有找到满足条件的,如果所有的元素都是返回false,最终some默认返回false (3) 方法自身的返回值 true: 有满足条件的元素 false: 没有满足条件的元素
5.数组every遍历
-
every 方法作用: 判断 数组中是否 所有元素 都满足条件 (逻辑&&, 全部满足)
应用场景 : (1)判断数组中是否所有元素都是 偶数
(2)开关思想 : 购物车是否全选 -
every语法特点 :
(1) 回调执行次数 != 数组长度 (2) 回调函数内部return return true * 循环继续。满足条件,如果所有元素都满足,最终every默认返回值true return false : * 循环结束。不满足条件,此时every返回值false (3) 方法自身的返回值 true: 所有满足都满足条件 false: 有元素不满足条件
6.数组 findIndex方法
-
findIndex方法作用: 找元素下标
应用场景 :
(1)如果数组中是值类型,找元素下标用: arr.indexOf( 元素 )
(2)如果数组中是引用类型,找元素下标: arr.findIndex( ) -
findIndex语法特点 :
(1) 回调执行次数 != 数组长度 (2) 回调函数内部return return true * 循环结束。 找到元素,返回当前元素下标 return false : * 循环继续。没找到。 如果全部都是false,最终返回固定值-1 (3) 方法自身的返回值 -1 : 没有 下标 : 有
7.数组reduce方法
-
数组reduce遍历 : 为每一个元素执行一次回调,返回最后一次回调的结果
-
reduce场景 : 求数组累加和
reduce的使用格式
reduce可以返回任意值,功能就是将一个数组的内容聚合成单个值。这个值可以是数字、字符串、甚至可以是对象或新数组
数组常用api
什么是回调地狱,如何解决
- 什么是回调地狱(函数作为参数层层嵌套)
如何解决
- 保持你的代码简短(给函数取有意义的名字,见名知意,而非匿名函数,写成一大坨)
- 模块化(函数封装,打包,每个功能独立,可以单独的定义一个js文件Vue,Creact中通过import导入就是一种体现)
- 处理每一个错误
- 创建模块时的一些经验法则
- Promise承诺、2F生成器、ES6等
for in和for of的区别
- 推荐在循环对象属性的时候,使用for…in,在遍历数组的时候的时候使用for…of。
- for…in循环出的是key,for…of循环出的是value
- 注意,for…of是ES6新引入的特性。修复了ES5引入的for…in的不足
- for…of不能循环普通的对象,需要通过和Object.keys()搭配使用
递归及应用场景
递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。
简单理解:函数内部自己调用自己,这个函数就是递归函数
应用场景:树形组件
https和http的区别:
HTTP是明文传输,HTTPS通过SSL\TLS+进行了加密
- HTTP 的端口号是80,HTTPS 是443
- HTTPS需要到CA+申请证书,一般免费证书很少,需要交费
- HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全
js延迟加载的方式
defer属性
async属性
动态创建DOM方式
使用jQuery的getScript方法
使用setTimeout延迟方法
让JS最后加载
get请求和post请求的区别:
GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符
POST:一般用于修改服务器上的资源,对所发送的信息没有限制。
GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。
哈希路由和history路由的区别:
Hash模式:
- url路径会出现#字符
- Hash值不包括在HTTP请求中,它是交由前端路由处理,所以改变hash值时不会刷新页面,也不会向服务器发送请求
- Hash值的改变会触发hashchange事件
History模式:
- 整个地址重新加载,可以保存历史记录,方便前进后退
- 使用HTML5+API(旧浏览器不支持)和HTTP服务端配置,没有后台配置的话,页面刷新时会出现404
父子组件的生命周期钩子:
v-mode和.sync的对比
两者本质都是一样,并没有任何区别:“监听一个触发事件” =“(val)=> value = val”。
- 只不过v-model默认对应的是input或者textarea等组件的input事件,如果在子组件替换这个input事件,其本质和.sync修饰符一模一样。比较单一,不能有多个。
- 一个组件可以多个属性用.sync修饰符,可以同时"双向绑定多个“prop”,而并不像v-model那样,一个组件只能有一个。
vue路由钩子beforeEach的参数
to:Route:即将要进入的目标路由对象
from:Route:当前导航正要离开的路由
next:Function:一定要调用该方法来resolve这个钩子。执行效果依赖next方法的调用参数。
计算属性和watcher的使用区别
v-if和v-show的区别:
v-if是动态添加,当值为false时,是完全移除该元素,即dom树中不存在该元素。
v-show仅是隐藏 / 显示,值为+false+时,该元素依旧存在于dom树中。若其原有样式设置了+display:none则会导致其无法正常显示。
key的作用:
key的作用主要是为了高效的更新虚拟DOM,其原理是vue在patch过程中通过key可以精准判断两个节点是否是同一个,从而避免频繁更新不同元素,减少DOM操作量,提高性能。
vue2中$nextTick:
在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM。
vue2中响应式的原理
主要做了这么几件事:数据劫持、收集依赖、派发更新
- 数据劫持:new+Vue的时候遍历data对象,用Object.defineProperty给所有属性加上了getter和setter
- 依赖的收集:render的过程,会触发数据的getter+,在getter的时候把当前的watcher对象收集起来
- 派发更新:setter的时候,遍历这个数据的依赖对象(watcher对象),进行更新