- 1、继承、原型链
原型【proto,prototype】通过特定构造函数实例化的对象,都可以访问圆形对象的方法,圆形对象是实例的公共访问容器-》查找变量过程-》原型链,好处:继承-〉方法继承,属性继承,
- 闭包
js中函数的执行有一个执行站(该执行站有创建函数上下文,即作用域,总用于中的变量)如果有函数嵌套,那么外层函数先入展,内层函数后入展,而执行刚好是后劲先出,内部函数执行完,出战,销毁上线问、作用域等,因此外层函数访问不到内部变量
\
函数执行栈(上下文、作用域中的变量,执行完出战,销毁上下文机器变量,如果有函数嵌套,那么外层先入,内层再入,执行时内层先出站外层访问不到内层)-》特殊情况:一个函数,返回一个函数,返回函数访问了外层函数变量,形成了闭包
\
function out() {
Const a = 1
Return () => {
a++
}
}
Fun = out()
Fun
\
- 2、原生js有哪些缺点
- 3、简述同步和异步的区别
js是单线程的,他的执行像一个流水线,一次只能执行一段代码,我们可以叫做任务;
任务分为同步任务和异步任务;
同步任务是主线程上排队执行的任务,只有前一个任务完成才能执行下一个任务;
异步任务是不在主线程上执行,而是进入任务队列,一些诸如ajax请求、settimeout的任务会由webaPIS执行返回其回调函数载队列中排队;
当主线程任务执行完毕后,任务队列开始通知主线程,请求执行任务,该任务按顺序进入主线程执行;
具体来讲:
\
\
- 4、promise使用及实现、promise的并行执行和顺序执行
是什么?
编写异步代码的一种方式;
怎么用?
构造实例:
通过Promise构造函数,创建promise实例;
构造函数接受一个函数作为参数,并且在实例化时立即执行;
作为参数的函数接受两个回调函数作为参数,resolve和reject
在参数函数执行过程中,如果内部调用了resolve回调,那么实例状态变成fulfiled;如果参数函数内部执行reject()回调函数,那么实例状态变成rejected;
调用.then(arg1,arg2):
.then可以为promise实例注册fulfied和reajected两个状态下的回调函数
状态为前者,执行第一个函数;
状态为后者,执行第二个函数;
用法总结:
构造promise实例,通过.then.then调用的方式就是promise
有什么用?
避免多个一步任务产生的回调地狱,编写成本高;
支持一步任务串行和异步任务并行;
异步任务串行:每个方法都返回promise对象的函数,串行.then
异步任务并行:有了多个异步任务后,下面假设想要多个异步任务并行执行,都执行成功后,才处理结果。用回调方式来写,可采用下面的办法:
\
\
\
- 5、javascript的数据类型、数据检查、深浅拷贝
基本类型、引用类型(按什么访问,存在哪里,动态加属性方法;操作符区分typeof instate Object.prototype.tostring.call();复制的区别;函数参数传递区别【实参给形参】)
数据检查:typeof instanceof Object.prototype.tostring.call()
\
深浅拷贝只针对引用类型
浅拷贝:简单理解是对最外一层属性的拷贝,如果属性中有对象,那么拷贝新对象与前者的属性是一个堆内存地址,修改会相互有影响; 函数实现:for in遍历传入对象,给{}赋值返回
深拷贝:复制对象的时候完全拷贝一个新对象,就算有属性是对象,也想互不影响,深拷贝的对象属性修改改变的事自己,不改变原来的; 函数实现:Json。parse(Json.stringfy)
\
例子:
数组浅拷贝:
\
深拷贝:
\
\
- 6、js精度丢失是什么造成的
js存储Number类型使用的是双精度浮点存储;
计算过程:十进制转二进制科学技术计数法,有效数字位数64位,末尾0舍1入,转成二进制计算后,再转成十进制,多层计算,中间就造成了误差,也是丢失精度根本原因
\
- 7、null和undefined的差异
简单理解:
undefined声明变量,未初始化;null刻意指定其值,未指向内存中任何变量;
表现形式:
类型区分:
typeof undefined = ‘undefied’ typeof null = ‘object’
Oject.prototype.todtring.call()直接区分
运算区分:
Number(undefies) = NaN Number(null) = 0
JSON对象属性值endefied过滤
\
\
- 8、数组去重
思路:
\
\
- map和set的区别
Map:
类似js对象
无限制的key:和普通对象相比,无限制的key,普通对象key只能string和sybol类型,它可以是任意类型作为key
循环 foreach 大小 m.size
\
Set:
数学里的集合{}
可以持续加入数据,返回对象本身,因此能链式调用,并且过滤重复数据
循环 for of 大小s.size 作用:数组去重 […new set(arr)]
- 9、深拷贝和浅拷贝的区别?怎么实现浅拷贝?怎么实现深拷贝?
针对引用类型:
浅:最外层拷贝,对象属性存储指针,修改有影响;实现:遍历。常用例子:数组concat\slice&push
深:拷贝新的对象,互相隔离独立,修改无影响;实现:JSON>PARSE(JSON.STRINGFY) 原理:对字符串基本类型的转换切断了dui内存关系,新对象了
- 10、暂时死区、变量提升、let, var, const 区别
- 11、自执行函数
(function(){})(参数)
第一半返回方法,后边的是执行
- 12、ES6箭头函数this指向
\
\
- 13、原型链
- 14、call, apply, bind
- 15、new实现
\
\
\
- 16、防抖节流
- 17、垃圾回收和内存泄漏
- 18、数组方法、数组乱序, 数组扁平化
创建数组: new Array() []
\
\
\
\
\
\
\
\
\
\
- 19、js数据类型有哪些?哪些是基本数据类型哪些是引用数据类型?
基本5种:
特点:
按值访问、不能添加属性和方法,在占内存中存储(标示符和值)
引用:对象类型
特点:按引用访问、能够动态添加方法和属性、由zhan和dui内存共同存储,战存储表示和指向对内存地址的引用(指针),对内存存值
区别:
复制 区别: 基本类型站中创建副本,且互不影响;引用的副本,存的地址 是一个,修改液,另一个会受影响
参数传递 区别
\
Typeof操作符判断基本类型,除了null,是Object。不能区分对象类型,都市Object。除了function
instanceof 判断对象是什么类型
最好的判断数据类型的方法
object. prototype .toString.call()
\
- 20、js事件循环和任务队列
\
\
\
- 21、事件委托
不在dom元素本身上监听事件,而是在其父元素上监听事件,通过事件冒泡,判断作用的target判断是哪个子元素触发的做判断,好处是动态子元素也可以有事件的绑定,如ul li
- 22、定时器
- 跨域?XSS、CSFR?
同源策略:
浏览器有同源策略用于防治XSS,CSFR等攻击,同源策略是指浏览器访问的协议、域名、端口都相同,一旦不相同就会发生跨于,这种情况下,禁止ajax请求、cookie读取等
解决方案:
jsop:
利用《script》标签,src属性无跨域特性,将请求参数通过src url传递,同时加一个query位callback的参数,。服务端接收后将结果哦返回到callback中,前端callback解析该数据即可
跨域资源共享:
需要浏览器和服务器通过xmlgttprequest属性配置共同支持
分为简单请求和非简单请求
简单请求:
浏览器request配置origin表示来自什么源,服务器响应配置Access-controle-allow-origin:*或者request origin ;是否发送cookie;是否发送其他header
非简单请求:
多预检,请求头上有三个字段:origin,允许的方法,header其他值
其他一样
- js异步加载
Js script标签正常放在中,由于浏览器是遇到标签草开始解析并渲染dom,因此放在head中会导致对于用户来讲,js会有一段时间的空白
解决方法:or
Defer:加载与dom渲染并行执行(异步)但不执行,等dom渲染完才执行
async:加载与执行js 和 dom渲染并行执行(异步)
共同点:
都不阻塞文档加载;脚本内都不能有document.wite()方法
动态加载:
window.onload(
doSomething()
)
\
- 引用计数
值有引用,引用数+1,改变了引用,不引用他了,引用书-1,直到引用书=0,会清楚内存
\
- 重绘和重排
重会:是盒子的位置、大小、颜色等外观属性发生变化后,浏览器的重新渲染
重排:DOM渲染树一枝/一部分发生隐藏、布局、结构变化导致的,浏览器会让这部分受影响的所有元素失效,重新构建这部分渲染树,完成重拍后,再将受影响的的部分重新绘制在屏幕上
\
关系:每个页面都至少一重排(回流)就是页面首次加载时候;重排一定重回
\
- 按需加载
触发了相应动作才 加载 相应功能,这些加载的文件可能是图片、js文件、css文件等
- 虚拟DOM
用js对象结构表示DOM结构
通过对象结构构建真正的DOM树,渲染在页面上;
当DOM发生变更的时候。构建一个新对象结构,并与旧DOM做比较,将变更反映到DOM树上
\
\
- 浏览器缓存
- 进程和线程,进程通信,管道
\
- 防抖节流
- H5性能优化
- 移动端适配
- 兼容性问题(样式、快速点击、桥调用)
- vue与react区别,与jquery相比的优劣,为什么选?vue响应式?
- Vue生命周期?响应式?
- V-if,v-show,v-for优先级
\
- 计算机网络协议模型,
物理层、链路层、网络层[IP]、传输层[tcp]、应用层【http】
- tcp/udp区别
- http1.0,1.1,2.0区别
- https和http区别
- !!!!常用状态状态码
- 三次握手
C 发起请求链接S
S确认,也发起链接C
C确认
第一次握手:S只可以确认自己接受C发送的报文
第二次握手:C确认收到了S发送的报文,且可以确认自己接受S发送的报文
第三次握手:S确认C收到了自己发送的报文段
\
- 浏览器缓存
\
\
\
\
\
\