1. 什么是对象? 面向对象的三大特性?
对象是属性和方法的集合,面向对象的三大特性是封装,继承,多态
2. 对象的创建的方式有哪些?,访问属性的方式有哪些
常见的有
- 字面量创建的方式 比如 let obj = {name:1,age:100};
- 实例化对象的方式 let obj = new Object();
- 构造函数方式
- 工厂模式创建对象
3. 对象的属性怎么访问,有什么区别?
对象的属性可以通过.或者[]来访问,他们有以下区别:
- .
.访问的属性名必须符合标识符命名规范,.后面不能跟变量,属性名不能跟引号 - [] 访问的属性名可以不符合标识符规范,可以使用变量,比如for循环中
- [] 访问的属性名可以不符合标识符规范,可以使用变量,比如for
4. 改变this指针指向的方法有哪些?
call,apply, bind方法都可以改变函数的this指向
- call方法apply调用后函数会立即执行,bind方法不会立即执行函数
- call方法和bind方法后面跟的是参数列表,apply的参数据是一个数组
5. 什么是原型?
每一个构造函数都有一个prototype属性,这个属性称之为函数的显示原型,
构造函数实例化后或者对象都有一个__proto__属性,称之为对象的隐式原型,后续原型链就是通过proto查找属性的。
6. 什么是原型链?
当我们访问对象的某个属性时,会先从当前对象中查找,如果没有找到的则继续去对象的proto隐士原型中去查找,,如果还没找到则继续向上级对象的原型中查找,直到找到顶层Object对象,如果没有找到返回undefined,这种通过对象的__proto__隐式原型查找属性的链条关系就称之为原型链。
7. prototype,proto,constructor 三者之间的关系?
- 每个构造函数都有一个Prototype属性,prototype有一个constructor指向构造函数本身
- 当构造函数实例化以后,有proto属性,proto指向构造函数的prototype属性。
8. ES5继承的方法有哪些?
- 原型链继承,把父方法的实例化对象赋给字方法的原型,不仅可以使用父方法自身的属性,也可以使用父方法原型中的属性,不能传参
- 构造函数继承,在字方法使用call或者apply关键字通过改变this指向继承,可以传递参数,不能使用父方法原型中的属性
9. 简单说一下ES6的class类
ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已, 他的本质还是函数,可以用typeof检测
10. 简单说一下class类相关的关键字
class类名关键字,
constructorclass类的构造函数
this关键字则代表当前实例对象
extends类继承的关键字
super调用父类方法的构造函数
11. JS的常见模块化规范有哪些?
- AMD异步模块加载规范
- commonJS规范
- ES新增的Moudle规范
12. export和export default 有什么不同?
export default 抛出一整个对象,不需要加{ } 引入不需要{} 可以跟抛出的对象名字不一致
export 抛出跟一个{} 引入的时候需要使用{}引入,名字必须跟抛出的名字一致,可以选择部分引入
13. 原生Ajax创建的步骤
- 实例化一个xmlhttpRequst对象信息
- 使用open方法创建连接,指定请求数据的方式
- 如果是post请求使用setRequestHeader设置请求头信息
- 使用onreadystatechange事件监听请求状态的改变回调
- send发送请求数据
14. jquery的ajax的参数有哪些?
$.ajax({
url: "url地址",
type:"请求方式get/或者post",
data:"传递数据",
dataType:"传送数据类型",
async: "true异步,false同步,默认同步",
success:function(res){
//成功事件回调
},
error:function(error){
//失败的事件回调
}
}}
15. Promise的概念,Promise有几种状态
Promise是ES6中的新增的异步处理方法,主要是用于解决ES5中使用回调函数产生的地狱回调的问题
Promise有三种状态,pedding准备中,fullfiilled已完成, rejected失败,状态只能有准备中=>已完成 或 准备中=>失败
16. Promise有哪些参数
参数两个: resolve和reject 执行resolve参数方法会调用then方法,执行reject参数方法调用catch方法
17. Promise的常见方法
then方法执行成功后调用的方法
catch方法执行失败调用的方法
all() 参数是个数组,执行多个Promise对象,必须所有的对象状态执行完后才会变成已完成的状态
race()方法 执行多个Promise对象,只要有一个对象状态是已完成,对象的状态就是已完成。
18. set常用的方法有哪些
set通过new实例化常用的方法有:
- 为集合添加数据 add方法 : set.add(元素)
- 获取集合数组的属性 size 使用 : set.size
- delete()删除数据 : set.delete(元素)
- has()判断集合中是否含有某个数据 : set.has(56)
- clear() 清空集合 set.clear()
19. map常用的方法有哪些?
map通过new Map创建一个对象:
- map.set("name","zs").set("age",18) -- 添加数据
- map.has("key") -- 判断是否含有某个数据 根据键操作(返回布尔值)
- map.delete("key") -- 删除数据 根据键
- map.clear() -- 清空集合
20. ES6的新特性有哪些?
- let const 定义块级作用域
- 箭头函数
- 解构赋值
- 扩展运算符
- 常见的数组的方法,伪数组
- 模板字符串
- class类
- 参数设置默认值
- promise
- for...of for...in
21. vue中常见的指令和含义
- v-text 渲染内容到节点中,不解析html
v-html 渲染内容到绑定的节点中,解析html
v-if 通过条件判断节点是否显示
v-show 通过条件判断节点是否显示
v-on 绑定事件,可以简写为@
v-bind 绑定属性 可以简写:
v-for 循环列表指令
v-model 表单双向绑定指令
22. v-if和v-show的区别?
当条件改变的时候v-if是通过DOM节点的添加和删除 控制结点的显示隐藏,v-show是通过css样式控制结点的显示隐藏,
v-if的切换成本比较高,v-show的渲染成本比较高,所以当切换的频繁的时候建议使用v-show,如果初次渲染数据比较多,建议使用v-if
23. vue中key的作用是?
唯一标识DOM结点,可以提高vue的渲染效率,也可以避免因DOM结点的插入而导致DOM更新错误的问题。
24. Vue中常见的修饰符及含义
.stop 阻止事件冒泡
.capture 设置事件捕获
.prevent 阻止默认事件
.self 之间作用在本身触发
.once 事件只触发一次
.navtive 组件触发的是原生的js事件
键盘修饰符操作
.enter, .space, .....等
.number 修饰符可以将 输入的值转化为Number类型
.trim 修饰符会自动过滤掉输入的首尾空格
.lazy 把v-model改为失去焦点触发
25. Vue中过滤器定义
过滤器分为全局过滤器和局部过滤器,全局过滤器可以在任何页面调用,局部过滤器只能在当前组件调用,过滤器使用管道符|调用,可以串联使用
全局过滤器定义: Vue.filter("过滤器名字",()=>{});
局部过滤器 filters:{过滤器名字}
26. vue中生命周期
创建阶段
- beforeCreate() 创建前阶段,这个时候还不能使用data中的数据
- created() 创建完成 最早可以使用data中的数据
挂载阶段 - beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。
- mounted: 挂载完成, DOM节点挂载到实例上去之后调用该钩子。
更新阶段 - beforeUpdate:数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
- updated:数据更新完成并且DOM更新完成后调用
销毁阶段 - beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
- destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定
27. 什么是虚拟DOM
Vue中不推荐使用DOM操作,为了提高渲染效率使用虚拟DOM,虚拟DOM就是用js对象来表示真实的DOM结构,当数据发生变化的时候重新创建一个新的DOM树结构,比较新旧DOM树的差异, 最终更新的真实的DOM节点中去。
28. 怎么理解MVVM架构模式
M 数据模型,负责逻辑
V 视图 负责页面渲染
Vmodel底层操作,负责视图和数据的交互,当数据发生变化通知视图修改
29. 如何理解Vue中双向绑定原理
vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式的方式来实现的, 也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变;
VUE双向数据绑定,其核心是 Object.defineProperty()方法,给Vue中的数据绑定get和set方法,当获取数据的时候,调用get方法,修改data中的数据的时候调用set方法,通过watcher监听器去更新视图,完成数据的双向绑定。
30. v-bind如何绑定class和style
v-bind通常用来绑定属性的,动态地绑定一些 class 类名或 style 样式
变量形式: v-bind:class = "变量",变量形式 ,这里的变量的值,通常是在css定义好的类名
数组语法:v-bind:class= "[变量1,变量2]" ,数组形式,其实跟上面差不多,只不过可以同时绑定多个class名;
对象语法:v-bind:class = {classname1:boolean,classname2:boolean},对象形式,这里的boolean通常是一个变量,也可以是常量、计算属性等,表达式为真的时候显示对应的class名字
用v-bind同样可以绑定style, key是属性,value对应属性对应的值m, vue会把驼峰命名法自动转换为-小写字母,如fontSize会转换为font-size
31. 组件中引入的步骤?
- import 导入子组件的路径,定义组件的名字
- components中注册子组件,不能是内置标签名字
- 父组件中挂载子组件的标签
32. 父传子组件通信
- 父组件中子组件的标签上定义一个自定义的属性
- 子组件中通过props接受父组件传递过来的数据内容,props可以是数组也可以是对象,
- props可以校验数据类型: String,Boolean,Number, Object, Array, Function Symbol
- default 设置默认值的内容
33. 子传父组件通信
- 子组件中绑定事件,调用自定义的方法,方法中this.$emit()向父组件传递数据
- $emit() 有两个参数,第一个参数自定义事件名,第二个要传递的数据
- 父组件的子组件标签绑定自定义事件,调用方法,方法的参数就是子组件传递过来的数据
34. props可以校验的数据类型
number数字,string字符串,boolean布尔值,Array, function symbol, object对象
35. 兄弟组件通信的流程?
- 借助共同的父组件传递数据,先子传父,在父传子
- eventBus总线程方式
- 定义一个eventBus.js对象抛出一个空的Vue对象
- 传递数据的组件中导入bus文件,通过bus.$emit()传递数据
- 接受数据的组件导入bus文件,通过bus.$on接受传递的数据