01.javascript高级面试汇总
1.说说你对面向对象的理解?
面向对象是一种注重结果的思维方式
面向对象 :封装,继承
2.原型对象是来解决什么问题的?
内存浪费+变量污染
3.原型对象,构造函数和实例对象三者的关系(三个属性)?
构造函数:prototype指向原型对象
原型对象:constructor指向构造函数
实例对象:proto指向原型对象
4.js是通过什么来实现面向对象继承的?
原型链
5.说说静态成员什么是实例成员?
静态成员:函数自己的成员
实例成员:实例对象的成员
6.说说你对js中的this指向理解?
谁调我
我就指向谁
函数名()
:指向window
对象名.函数名():
指向这个对象
new 函数名()
:new创建的实例
7.请说说call apply bind的区别及对应应用场景?
js基础
传参方式不同
: call是单个传参,apply是数组、伪数组传参
执行机制不同
: call和aplly会立即执行, bind不会立即执行而是得到一个修改this的新函数
js高级
共同点: 都可以修改this ,第一个参数都是修改this
不同点: 传参不同: call是逐一传参,apply是数组/伪数组传参
函数名.call(修改的this,参数1,参数2…)
函数名.apply(修改的this,数组/伪数组)
call和aplly会立即执行, bind不会立即执行而是(而是返回一个修改的this之后的新函数)得到一个修改this的新函数
8.请说说闭包是什么?
- 闭包 是 一个
可以访问其他函数内部变量
的函数
函数 + 上下文引用
9.请说说闭包是干什么用的?
解决变量污染
10.请说说什么是递归函数?
递归函数
是一个在函数内部调用自己
的函数
11.请说说递归函数的应用场景
浅拷贝拷贝地址 得到的= 变>(原数据改变) 和 得到的=变> (原数据不变) 深拷贝数据
- 遍历dom树
12.请说说数组几个常用的迭代方法(遍历方法)
筛选数组: arr.filter()
检测是否所有元素满足条件(开关法) : arr.every()
遍历数组 : arr.forEach()
数组叠加(求累加和) : arr.reduce()
02.webapi
(1).事件委托面试点
事件三要素:事件源 事件类型 事件处理函数 事件流三要素 事件捕获 事件目标 事件冒泡
1.什么是事件委托
给父元素注册事件,委托给子元素处理
2.事件委托原理
事件冒泡
3.事件委托注意点
this指向父元素
e.target指向触发事件的子元素
4.事件委托场景: 给动态新增元素注册委托事件
(2)localStorage硬盘储存与sessionStorage内存储存 区别
1.相同点:
作用一致::用于储存数据
都是只能存储字符串类型数据
(上线5MB)
2.不同点:
localStorage :硬盘储存
(永久储存,页面关闭还在,存在硬盘)
sessionStorage:内存储存
(临时存储,页面关闭了就消失)
3.localStorage与sessionStorage如何存储引用类型数据)(数组和对象)转JSON存储
json -> js : let jsObj = JSON.parse( json格式 )
js -> json : let jsonStr = JSON.stringify( js对象 )
js高级
(1)new关键字做了那些事情
1.创建空对象
2.this指向这个对象
3.对象赋值
4.返回实例对象
(2)原型链相关
1.原型链作用: 面向对象继承
2.对象访问原型链的规则 : 就近原则
先访问自己,自己没有找原型,原型没有找原型的原型,直到原型链的终点
如果还没找到,属性则获取undefined ,方法则报错xxx is not defined
(3)如何判断数据类型
typeof有两种数据类型无法检测,null,array (数组)
Object.protoype.toString.call(数据)
(4)闭包
(天天用 网页回调都是 js中闭包是无处不在的)
1.闭包是什么 :
闭包 是 使用其他函数内部变量的 函数 (闭包 = 函数 + 其他函数内部变量)
闭包 = 函数 + 上下文引用
2.闭包作用 : 解决全局变量污染
(5)递归及应用场景(循环用的多 循环麻烦的时候用递归)
1.递归 : 在函数内部调用自己
2.递归作用 :
浅拷贝与深拷贝
遍历dom树
(6) 浅拷贝与深拷贝
1.浅拷贝:拷贝地址
, 修改拷贝后的数据原数据也会变化
2.深拷贝:拷贝数据
, 修改拷贝后的数据原数据不会变化
推荐 json : let obj = JSON.parse( JSON.stringify( 对象 ) )
递归
(7)数组常用迭代方法 * 详解回顾js语法
1.数组map方法作用: 映射数组
(添加(数组里面有标签)字符串(join)到DOM树)
说人话:按照某种映射关系, 把数组的每一个元素给修改了
2.数组filter方法作用: 筛选数组
应用场景: 筛选数组,将符合条件的元素放入新数组中 举例: 找出数组中所有大于10的元素
3.数组forEach方法作用: 遍历数组
应用场景: 和 for(let i=0;i<arr.length;i++){
} 功能一致
/* 逻辑||或一真则真
4. 数组some方法作用: 判断数组中是否有符合条件的元素
应用场景: 非空判断(判断多个表单元素,有没有空文本)举例 : 判断数组中有没有负数
/* 逻辑与&& 一假都假
5.数组every方法作用: 判断数组中 是否所有的 元素都满足条件
应用场景: 开关思想 (购物车全选框) 举例 : 判断数组中是不是都是正数
6.数组findIndex方法作用: 查找元素的下标
\* 数组的findIndex与indexOf异同点
相同点:功能一致,都是查找元素下标。 有则返回下标,无则返回固定值-1
不同点:应用场景不同
indexOf : 查找数组中的元素都是值类型
findIndex : 查找数组中的元素都是引用类型
7.数组reduce方法 : 数组累加器方法
对数组每一个元素执行一次回调函数,累加最后一次回调的结果
reduce场景: 数组元素求和、求数组元素最大值