愛在花開的季節 发表于 3 天前

熬夜整理小米Web前端面试题,学习vue源码(11(1),字节跳动前端开发面试题

for (key in parent) {
mergeField(key);
}
// 遍历 child 的key ,排除已经处理过的 parent 中的key
for (key in child) {
if (!parent.hasOwnProperty(key)) {
mergeField(key);
}
}
// 拿到相应范例的合并函数,举行合并字段,strats 请看下面
function mergeField(key) {
// strats 生存着各种字段的处理函数,否则使用默认处理
var strat = strats || defaultStrat;
// 相应的字段处理完成之后,会完成合并的选项
options = strat(parent, child, vm, key);
}
return options
}
这段代码看上去有点绕,其实无非就是

[*] 先遍历合并 parent 中的key,生存在变量options
[*] 再遍历 child,合并补上 parent 中没有的key,生存在变量options
[*] 优先处理 mixins ,但是过程跟上面是一样的,只是递归处理而已
在上面实例初始化时的合并, parent 就是全局选项,child 就是组件自定义选项,因为 parent 权重比 child 低,所以先处理 parent 。
“公司开除步伐猿,也是先开始作用较低。。”
重点其着实于 各式各样的处理函数 strat,下面将会逐一枚举
注意,不要对strat这个词暗昧,其实就是strategy策略一词的缩写,它就是一个对象,这个对象里
生存了上面说的各种策略。如下
strat = {
// 合并data的策略
data: function(parentVal, childVal, vm) {
return mergeDataOrFn(
parentVal, childVal, vm
)
}
// 合并生命勾子的策略
created: mergeHook;
mounted: mergeHook;
。。。。。
}
下面讲各种合并策略
1. 默认策略 defaultStrats
该策略 不生存在 strat对象中,也就是说在strat对象找不到key对应的策略时就会使用该策略,上面 mergeOptions函数中 的
function mergeField(key) {
// strats 生存着各种字段的处理函数,否则使用默认处理
var strat = strats || defaultStrat;
// 相应的字段处理完成之后,会完成合并的选项
options = strat(parent, child, vm, key);
}
这段代码就是这个意思。
好了,看下默认策略的源码实现
var defaultStrats= function(parentVal, childVal) {
return childVal === undefined ?
parentVal :
childVal
};
这段函数言简意赅,意思就是优先使用组件的options
组件options>组件 mixin options>全局options
2.data
strats.data = function(parentVal, childVal, vm) {
return mergeDataOrFn(
parentVal, childVal, vm
)
};
function mergeDataOrFn(parentVal, childVal, vm) {
return function mergedInstanceDataFn() {
var childData = childVal.call(vm, vm)
var parentData = parentVal.call(vm, vm)
if (childData) {
return mergeData(childData, parentData)
} else {
return parentData
}
}
}
function mergeData(to, from) {
if (!from) return to
var key, toVal, fromVal;
var keys = Object.keys(from);
for (var i = 0; i < keys.length; i++) {
key = keys;
toVal = to;
fromVal = from;
// 假如不存在这个属性,就重新设置
if (!to.hasOwnProperty(key)) {
set(to, key, fromVal);
}
// 存在雷同属性,合并对象
else if (typeof toVal ==“object” && typeof fromVal =="object) {
mergeData(toVal, fromVal);
}
}
return to
}
我们先默认 data 的值是一个函数,简化下源码 ,但是其实看上去照旧会有些复杂
不外我们主要了解他的工作过程就好了
1、两个data函数 组装成一个函数
2、合并 两个data函数执行返回的 数据对象
3.生命钩子
把全部的钩子函数生存进数组,紧张的是数组子项的次序
次序就是如许
[
全局 mixin - created,
组件 mixin-mixin - created,
组件 mixin - created,
组件 options - created
]
所以当数组执行的时候,正序遍历,就会先执行全局注册的钩子,最后是 组件的钩子
function mergeHook(parentVal, childVal) {
var arr;
arr = childVal ?
// concat 不只可以拼接数组,什么都可以拼接
( parentVal ?
// 为什么parentVal 是个数组呢
// 因为无论怎么样,第一个 parent 都是{ component,filter,directive}
// 所以在这里,合并的时候,肯定只有 childVal,然后就变成了数组
parentVal.concat(childVal) :
( Array.isArray(childVal) ? childVal: )
) :
parentVal
return arr
}
strats[‘created’] = mergeHook;
strats[‘mounted’] = mergeHook;
… 等其他钩子
4. component、directives、filters
我不停觉得这个是比较好玩的,这种范例的合并方式,我是从来没有在项目中使用过的
原型叠加
两个对象并没有举行遍历合并,而是把一个对象直接当做另一个对象的原型
这种做法的利益,就是为了保存两个雷同的字段且能访问,制止被覆盖
学到了学到了…反正我是学到了
strats.components=
strats.directives=
strats.filters = function mergeAssets(
parentVal, childVal, vm, key
) {
var res = Object.create(parentVal || null);
if (childVal) {
for (var key in childVal) {
res = childVal;
}
自我介绍一下,小编13年上海交大结业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里不停到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索发展大概是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学结果低效又漫长,而且极易碰到天花板技术故步自封!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够资助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
https://i-blog.csdnimg.cn/blog_migrate/f3d2ce21876c47d837f7e7abce6ad266.jpeg
https://i-blog.csdnimg.cn/blog_migrate/7bc907eac401cd11e59e390fc555e4ee.png
https://i-blog.csdnimg.cn/blog_migrate/6ee005f71cfb401c6be632afa7522c3a.png
https://i-blog.csdnimg.cn/blog_migrate/99fdb3e3123fb6f54fe102ec5de04f5d.png
https://i-blog.csdnimg.cn/blog_migrate/7daad6a5eb59ff1f4c4c123ebb99c642.png
https://i-blog.csdnimg.cn/blog_migrate/b9f2e0f165efe064922b2bf35d8d5b83.png
既有适合小白学习的零基础资料,也有适合3年以上履历的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码课本、实战项目、讲授视频,并且后续会持续更新
假如你觉得这些内容对你有资助,可以添加V获取:vip1024c (备注前端)
https://i-blog.csdnimg.cn/blog_migrate/ab849b8684898a74f0c072daab0b3950.png
ajax

1)ajax请求的原理/ 手写一个ajax请求?
2)readyState?
3)ajax异步与同步的区别?
4)ajax传递中文用什么方法?
https://i-blog.csdnimg.cn/blog_migrate/4f8040cef0383d5a2d2b61413f424990.png
https://i-blog.csdnimg.cn/blog_migrate/058a4d2c617ce4e1ed1ab3f7b6cd0e3f.png
一个人可以走的很快,但一群人才气走的更远。岂论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎扫码参加我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!
https://i-blog.csdnimg.cn/blog_migrate/f42eb9d9acf776c5dd958923515fed5a.png
8663)]
[外链图片转存中…(img-r1xmvaMg-1712552108664)]
既有适合小白学习的零基础资料,也有适合3年以上履历的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码课本、实战项目、讲授视频,并且后续会持续更新
假如你觉得这些内容对你有资助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-jahfhqrb-1712552108664)]
ajax

1)ajax请求的原理/ 手写一个ajax请求?
2)readyState?
3)ajax异步与同步的区别?
4)ajax传递中文用什么方法?
[外链图片转存中…(img-eYy9cmFG-1712552108664)]
[外链图片转存中…(img-GJWjM047-1712552108665)]
一个人可以走的很快,但一群人才气走的更远。岂论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎扫码参加我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!
[外链图片转存中…(img-aXuJaSAH-1712552108665)]

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 熬夜整理小米Web前端面试题,学习vue源码(11(1),字节跳动前端开发面试题