1.js中原型和原型链的工作原理
①所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)
②所有函数拥有prototype属性(显式原型)(仅限函数)
③原型对象:拥有prototype属性的对象,在定义函数时就被创建
1.实例的隐式原型指向它构造函数的显式原型
2查找属性,如果本身没有,则会去__proto__中查找,也就是构造函数的显式原型中查找。
如果构造函数中也没有该属性,因为构造函数也是对象,也有__proto__,那么会去它的显式原型中查找,一直到null,如果没有则返回undefined
2.js中闭包是怎么形成的,有哪些用途
内部函数访问外部函数中的变量,这个变量始终保存在内存中,不会随着函数的结束而自动销毁。
1.匿名自执行函数
2.缓存
3.实现封装
4.实现面向对象
ps:匿名函数:1.实现闭包
2.模拟块级作用域,减少全局变量,降低命名冲突
3.什么是跨域请求,为什么浏览器拒绝跨域请求,实现跨域的方法
1.跨域:协议名(http/https),域名,端口号有一个不同源就是跨域
2.拒绝跨域原因:①跨域可以请求的话,很多服务器会遭受额外攻击
②可以在别人的网站里攻击其他服务器
③浏览器是客户端,会导致服务器流量过大
3.方法:①jsonp跨域(只有get请求)
②CORS设置请求头
③document.domain
④postMessage
4.js中实现对对象的深拷贝
栈:基本类型的值和引用类型的地址
堆:引用类型的值
深拷贝:JSON.parse(JSON.stringify)
5.js函数中this的指向
1.全局环境下,this指向window
2.对象调用函数时,this指向当前对象
3.构造函数中,如果返回对象,this指向这个对象,否则指向函数实例
4.apply和call指向传入的第一个参数
6.在浏览器地址栏输入一个网址,从敲下回车到页面完全加载完毕,中间发生了什么
- DNS域名解析(域名还原为IP地址)
- TCP连接
- HTTP请求
- 处理请求返回HTTP响应
- 页面渲染
- 关闭连接
7.vue中computed和methods中函数的调用机制有何不同
1.methods调用函数加()
2.computed如果相关依赖不发生改变,就会一直沿用第一次的值
3.methods是实时的,在重新渲染时函数会重新调用执行
8.vue中双向绑定指令v-model的本质是什么,自定义组件如何支持v-model
本质:是通过数据劫持结合发布者-订阅者模式的方式来实现的。 数据劫持:Object.defineProperty用set,get方法实现重写 发布者-订阅者模式:
1.实现一个监听器Observer,用来劫持并监听所有属性,如果有变动的,就通知订阅者。
2.实现一个订阅者Watcher,可以收到属性的变化通知并执行相应的函数,从而更新视图。
3.实现一个解析器Compile,可以扫描和解析每个节点的相关指令,并根据初始化模板数据以及初始化相应的订阅器。
9.vue中实现MVVM的原理
MVVM 是 Model-View-ViewModel 的缩写。
Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。
View 代表UI 组件,它负责将数据模型转化成UI 展现出来。
ViewModel 监听模型数据的改变和控制视图行为、处理用户交互,简单理解就是一个同步View 和 Model的对象,连接Model和View。
在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。
ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。