前端面试1

记录下我遇到过的前端面试题 (一)

(一)简述Vue的双向绑定:

        最近的项目基本都是基于Vue进行开发的,但是却对Vue的双向绑定原理理解的马马虎虎。被面试到这个问题的时候,我的回答是:基于Object.defineProperty()这个核心方法,并且通过这个方法的setter和getter对数据进行劫持监听和设置新值。当被问到能再详细点吗,就傻眼了(自由发挥。。。)。

鉴于此,虽然不求完全吃透,但是用了这么久,起码双向绑定的实现逻辑得能简述出来。

Vue数据双向绑定原理

采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的settergetter,在数据变动时发布消息给订阅者,触发相应的监听回调。此时实现过程涉及3个非常重要的东东:ObserverWatcherCompile。

Observer: 一个数据监听器,首先是通过递归方法遍历所有的属性值,并且使用Object.defineProperty( )来对值进行劫持绑定。

Watcher:一个订阅者,用于接收Observer发来的更新信息,并且执行相应的更新回调。

Compile:对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数

实现过程:

首先数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者Watcher。Watcher连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图。


(二)说说浏览器渲染过程:

        当时碰到这个问题的时候也是挺懵逼的,因为不太清楚问的是哪个过程。那么这边就以页面生成的过程作为问题。我记得我当时的回答是:首页HTML生成好DOM树,然后CSS规则生成树,接着结合HTML树和CSS规则树布局。嗯嗯,渣渣的问答。

具体渲染过程:

1. 解析HTML生成DOM树。

2. 解析CSS生成CSSOM规则树。

3. 将DOM树与CSSOM规则树合并在一起生成渲染树。

4. 遍历渲染树开始布局,计算每个节点的位置大小信息。

5. 将渲染树每个节点绘制到屏幕。


注意的是:

1. 渲染过程会碰到渲染阻塞。也就是当浏览器遇到一个 script 标记时,DOM 构建将暂停,直至脚本完成执行,然后继续构建DOM。每次去执行JavaScript脚本都会严重地阻塞DOM树的构建,如果JavaScript脚本还操作了CSSOM,而正好这个CSSOM还没有下载和构建,浏览器甚至会延迟脚本执行和构建DOM,直至完成其CSSOM的下载和构建。

2. CSS 优先:引入顺序上,CSS 资源先于 JavaScript 资源; JS置后:我们通常把JS代码放到页面底部,且JavaScript 应尽量少影响 DOM 的构建。


(三)实现一个滚动型的无限加载数据组件:

        当时回答的实现逻辑是有2种:

         (1) 首先请求前2页的数据,然后给滚动条绑定一个滚动事件,监听滚动条滚动距离,当滚动条滚动到离底部还有一定的距离的时候马上请求下一页的数据。(记得解绑事件)

         (2) 首先请求前2页的数据,然后添加一个定时器函数,每隔0.5s监听当前浏览器高度,当滚动条高度离底部还有一定的距离的时候马上请求下一页的数据。(记得清楚定时器)

        如果还有其他更好的办法,麻烦指教下哈哈哈。


(四)CSS垂直居中方式:

    面试的时候好像回答出了好几个,也没回答全部。不过当时是被面试人员像挤奶一样挤出来的,面试员就一句:还有吗?

    那就重新整理下:

    (1)文本居中用line-height;

    (2)vertical-align属性;

    (3)display:table (或者:+ vertical-align);

    (4)display:fiex;

    (5)position:absolute + margin;(有多种实现方式,可以具体查查) 

    (6)position:absolute(50%, 50%) + transform:translate(-50%,-50%); //实际原理和第5点很像

    (7)padding和margin + 已知距离;

    (更多..... )

(五)实现接口同步请求的方式:

   当时只回答出了函数内回调(俗称地狱回调)、Promiseasync(await)。 后来查了下,通过generator函数也可以。


(六)JS的数据类型和引用类型:

  六大数据类型:Number、String、Boolean、Null、Object、undefind(我当时漏掉这个);

  三大引用类型:Object、Array、Function;


(七) 什么是高阶函数

英文叫Higher-order function。JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。常用高阶函数有map/reduce/filter等等。



(八) Flex布局

Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为 Flex 布局。基本属性:flex-basis、flex-direction、flex-flow、flex-grow、flex-shrink、flex-wrap


后话:

简单粗略记录了一下,希望以后再次面试到这个问题,肚子有水还能再吹吹!(仅供参考,如有疑问错误请指出)


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 前端面试问题集锦 JavaScript 部分 1、JQuery $(document).ready() 和 win...
    涯无凌阅读 940评论 0 2
  • 1.如何判别Object、Array对象 通过Object.prototype.toString可以检测Objec...
    卡农me阅读 450评论 0 1
  • 背景 这学期想找一份暑假实习,3.12走内推投了阿里,现在三面已经过去一周多,趁着假期记录一下。 一面(3.16)...
    睡的巨晚阅读 333评论 0 2
  • 1.请你谈谈Cookie的弊端 cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很...
    熊孩子CEO阅读 720评论 0 11
  • 把我唤醒的是你, 在每一个安静的清晨。 努力寻找的是你, 在每一次睡醒之后。 让我烦躁的是你, 在每一次与你分开以...
    无敌老超人阅读 495评论 6 9