笔记|电话面试-----海康威视

谈谈你的项目经历,遇到的困难 js继承机制 js new一个对象内部是怎么实现的

  1. 创建一个空对象,将它的引用赋给 this,继承函数的原型。
  2. 通过 this 将属性和方法添加至这个对象
  3. 最后返回 this 指向的新对象,也就是实例(如果没有手动返回其他的对象)
js事件循环 js事件委托 冒泡 阻止冒泡
找到元素,ul > 无数个li标签,都有点击事件,如何处理 => 给 ul一个点击事件,会自动冒泡道外层 => jq中常有
捕获阶段: 从外到内 从内到外
function bubbles(e){ var ev = e || window.event; if(ev && ev.stopPropagation) { //非IE浏览器 ev.stopPropagation(); } else { //IE浏览器(IE11以下) ev.cancelBubble = true; } }

jq中的 add event 说一下promise,实现原理 this的指向问题 如何改变this的指向
  1. call
  2. apply
  3. bind()
let m = { call:"Hello...", invoke:function(){ console.log(this.call); } } let n = m.invoke; n(); // undefined n.call(m) // "hello..." n.apply(m) // "hello..." n.bind(m) // "hello..."

call和apply的区别就是,call后面可以写道多个参数,apply后面第二个参数只能是数组形式
获取dom所有元素,document.all方法,打印出来的是一个数组,类数组,只有数组的长度,没有数组的方法,只能for遍历,call和apply方法改变this指向既可以使用数组方法 array.form方法 Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组
1、该类数组对象必须具有length属性,用于指定数组的长度。如果没有length属性,那么转换后的数组是一个空数组
2、该类数组对象的属性名必须为数值型或字符串型
3、 如果内容小于(《 )length;则使用underfined进行填充
常用数组方法 h5新特性 localStorage,sessionStorage区别 flex布局 css动画 vue生命周期 v-for中 key的作用,key=index问题什么 在进行绑定的时候,有的时候操纵原数组,增删改查会改变index,有些错误信息会保留下来
computed和watch,methods区别 computed 应用场景
  1. 适用于一些重复使用数据或复杂及费时的运算。我们可以把它放入computed中进行计算, 然后会在computed中缓存起来, 下次就可以直接获取了。
  2. 如果我们需要的数据依赖于其他的数据的话, 我们可以把该数据设计为computed中。
computed和methods区别
1- computed 是基于响应性依赖来进行缓存的。只有在响应式依赖发生改变时它们才会重新求值, 也就是说, 当msg属性值没有发生改变时, 多次访问 reversedMsg 计算属性会立即返回之前缓存的计算结果, 而不会再次执行computed中的函数。但是methods方法中是每次调用, 都会执行函数的, methods它不是响应式的。数据改变后,computed只进行一次计算,缓存,而methods方法,每次调用都会重新执行
2- computed中的成员可以只定义一个函数作为只读属性, 也可以定义成 get/set变成可读写属性, 但是methods中的成员没有这样的
watch的使用场景是:当在data中的某个数据发生变化时, 我们需要做一些操作, 或者当需要在数据变化时执行异步或开销较大的操作时. 我们就可以使用watch来进行监听。
watch 和 computed的区别是:
相同点:他们两者都是观察页面数据变化的。
不同点:
computed只有当依赖的数据变化时才会计算, 当数据没有变化时, 它会读取缓存数据。
watch每次都需要执行函数。watch更适用于数据变化时的异步操作
watch监听不到的问题 受JS的限制, Vue不能检测到对象属性的添加或删除的。它只能监听到obj这个对象的变化,比如说对obj赋值操作会被监听到。比如在mounted事件钩子函数中对我们的obj进行重新赋值操作, 如下代码:
解决办法
watch中有一个 deep 深度监听,就是可以从对象属性一层一层监听改变,比较耗性能一般直接用 obj.key来直接监听
$set
data () { return { student: { name: '', sex: '' } } }

如果这时候我们希望给 student 添加一个 age 属性
mounted() { this.student.age = 18 }

我们会发现这个视图没有改变,受JS的限制, Vue不能检测到对象属性的添加或删除的。它只能监听到obj这个对象的变化
因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的
我们可以使用$set()方法,既可以新增属性,又可以触发视图更新
// $set 用法 (obj,"key",value) this.$set(this.student,"age",18)

vue中的data为什么是函数形式的 防止 组件调用的时候,两个 data 之间互相影响,采用函数式,这样 就是 两个 data 对象 ,就不会互相影响
组件间传值 父子,兄弟,非父子传值
$emit ,props ,vuex, eventbus
说说eventbus,就是 bus总线
this.bus.$emit() this.bus.$on()

vue源码 v-model双向绑定是怎么实现的 【笔记|电话面试-----海康威视】vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
vue3了解多少?

    推荐阅读