根据我的面试经历,一般小公司的面试环节,比较关心框架的熟练程度,以及独立开发组件的能力

但大厂通常有五轮以上的面试,而且对 js 基础语法很是看重

于是我总结了一些关于 js 基础的面试对话,有的当时没答上来,就在总结的时候就加了点料

忽然觉得又该读一遍犀牛书了...

一、面试对话

问:你知道 js 是由哪三部分构成的么?

答:有 js 的语法核心 ECMAScript,还有文档对象模型 DOM,以及浏览器对象模型 BOM。

问:那你觉得 dom 的作用是什么?

答:喵喵喵???

问:我换一个问法吧,如果没有 DOM,会对开发有什么影响?

答:那根本没法开发啊。前端的主要工作有两个,一个是高保真的实现 UI 设计稿,一个是高效率的从后端获取数据并渲染到页面上。如果没有 DOM,就不能渲染页面了。

问:但实际上所谓的渲染页面,就是返回一堆 html,你觉得 html 和 DOM 有区别么?

答:html 说穿了就是一个字符串,浏览器解析 html 并抽象成一个树结构的文档对象,以方便 js 操作,这个文档对象这就是 dom。

问:好的,现在我有一个 <ul> 标签,里面有 5 个 <li> 标签,怎样才能在最后一个 <li> 标签后再插入一个 <li> 标签

答:用 getElementById 或者 getElementsByClassName 之类的方法获取 <ul> 节点,然后用 append() 插入 <li> 标签。

问:append() 是 jQuery 的方法吧,如果不用 jQuery 呢?

答:啊咧?append() 是 jQuery 的方法么?

答:哦哦,那就用 appendChild() 方法,而且得先用 createElement() 创建标签。

问:如果要加在第一个 <li> 前面呢?

答:那就用 prepend()

问:嗯?

答:哎呀,prepend() 也是 jQuery 的方法,应该用 prependChild()

问:喵喵喵??你特么在逗我?有这个方法吗?

答:开个玩笑开个玩笑,其实是 insertBefore() 方法。

问:没错,insertBefore() 可以在目标元素前面插入一个新元素,如果要把元素放在目标元素之后呢?

答:emmmmm... insertAfter() ?

问:js 中并没有这个方法!再好好想想?

答:还是用 insertBefore() 方法,第二个参数传入目标元素的下一个元素,也就是 targetElement.nextSibling

问:dom 操作挺熟练哈,工作中经常这么搞么?

答:(擦一擦汗)没有没有,工作中 vue 用的比较多,数据驱动,不怎么关心 DOM

问:常用 vue,那你一定知道虚拟 DOM 了吧?说说看呢

答:每一次 DOM 的变动,浏览器就得重新渲染一次页面。为了提高页面的性能,就应该尽量减少 DOM 的变更次数。现代框架通常会用一个对象来保存目标 DOM 节点的标签名、属性、内容、子节点等信息,也就是用 js 的对象结构来表示 DOM 树的结构,这个 js 对象就是虚拟 DOM。当状态变更的时候,js 会先更新虚拟 DOM,再通过 diff 算法比较虚拟 DOM 和真实 DOM 的差异,找出最少变更的方案,最后一并更新到真实 DOM 中。

问:(邪魅一笑)所以使用虚拟 DOM 的主要目的是为了提高性能是吧?

答:对啊,vue 的优点之一就是轻量化,渲染速度快,就是因为采用了虚拟 DOM。

问:但是虚拟 DOM 最终同样也是操作真实 DOM,为什么会更快呢?

答:如果全程操作真实 DOM 的话,任何一个状态的变更,都会导致页面重绘,这个环节就非常耗性能了。采用虚拟 DOM 的话,就能避免这个问题。而且如果 diff 算法效率高的话,总是能用最少的改动来更新 DOM。总的来说,就是不会出现频繁的、大面积的 DOM 操作,从而提升了页面性能。

问:让我们进入下一个问题...

二、注释

1. DOM:Document Object Model  文档对象模型

2. BOM:Browser Object Model  浏览器对象模型

3. insertBefore() 方法:该方法需要父元素 parentElement 调用,并接收两个参数,第一个参数是需要插入的元素 newElement,第二个是目标元素 targetElement。

parentElement.insertBefore(newElement, targetElement)

前端面试(原生js篇) - DOM的更多相关文章

  1. 前端面试(原生js篇) - 精确运算

    一.面试题 问:开发的时候有用到过 Math 吗? 答:很多啊.比如生成 GUID 的时候,就会用到 Math.random() 来生成随机数. 问:别的呢?比如向下取整.向上取整? 答:向下取整是  ...

  2. 框架操作DOM和原生js操作DOM比较

    问题引出 对于Angular和React操作DOM的速度,和原生js操作DOM的速度进行了一个比较: 一个同学做的demo 代码如下: <!DOCTYPE html> <html n ...

  3. 原生js操作Dom节点:CRUD

    知识点,依然会遗忘.我在思考到底是什么原因.想到研究生考试准备的那段岁月,想到知识体系的建立,知识体系分为正向知识体系和逆向知识体系:正向知识体系可以理解为教科书目录,逆向知识体系可以理解考试真题. ...

  4. 2019前端面试系列——JS面试题

    判断 js 类型的方式 1. typeof 可以判断出'string','number','boolean','undefined','symbol' 但判断 typeof(null) 时值为 'ob ...

  5. 原生JS获取DOM 节点到浏览器顶部的距离或者左侧的距离

    关于js获取dom 节点到浏览器顶/左部的距离,Jquery里面有封装好的offset().top/offset().left,只到父级的顶/左部距离position().top/position() ...

  6. 关于Echarts的原生js获取DOM元素与动态加载DOM元素的冲突问题

    1.前言: 最近在做的看板项目,因为需要循环加载后台数据,并且用Echarts做数据呈现,所以jQuery和angular等库统统靠边站,Echarts用的是原生js获取DOM元素,至于诸多不兼容等深 ...

  7. 原生js操作dom的方法

    今天学习了原生js的dom节点的操作,就记录下来,仅供自己以后参考. 1)创建节点:除了可以使用createElement创建元素,也可以使用createTextNode创建文本节点. documen ...

  8. 2019前端面试系列——JS高频手写代码题

    实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...

  9. 原生JS 实现 dom ready

    记录一下项目技术问题: 记得:放在head标签内的脚本,第一时间执行 var baseTools = { // dom ready ready: function( f ){ var ie = !!( ...

随机推荐

  1. 杀掉所有 skynet 进程

    ps aux | grep skynet | awk '/config/{print $2}' | xargs kill

  2. 简单记录常用git 命令

    声明:仅作笔记用 拉取远程代码 1.git pull 2.如果需要,输入账户名密码 将本地代码推送到远程 1.git push 2.如果需要,输入账户名密码 同步远程分支 1.git fetch 2. ...

  3. 线程&线程控制

    线程基本概念: 1 线程 (1)概念:linux下没有真正的线程,所谓的线程都是通过进程的pcb模拟的,因此linux下的线程也称为“轻量级进程”,之前我们所说的进程现在看来,可以理解为:只有一个线程 ...

  4. Handler 、 Looper 、Message异步消息处理线程机制( hander消息机制原理)

    Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念. 那么什么叫异步消息处理线程呢? 异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次, ...

  5. xamarin android 实现二维码带logo生成效果

    MultiFormatWriter writer = new MultiFormatWriter(); Dictionary<EncodeHintType, object> hint = ...

  6. 转载:Java、C#双语版配套AES加解密示例

    转载,原文出处 http://www.cnblogs.com/lzrabbit/p/3639503.html 这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己 ...

  7. Android中实现activity的页面跳转并传值

    一个Android应用程序很少会只有一个Activity对象,如何在多个Activity之间进行跳转,而且能够互相传值是一个很基本的要求. 本次我们就讲一下,Android中页面跳转以及传值的几种方式 ...

  8. [java初探05]__数组的简单认识及Arrays类的常用方法

    数组是具有相同数据类型的一组数据的集合.在程序设计中,这样的集合称之为数组.数组的每个元素都具有相同的数据类型,在Java中数组也被看为一个对象. 在里,了解了数组的定义之后, 我们知道了,数组并不是 ...

  9. 【IT笔试面试题整理】反转链表

    [试题描述]定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点 [参考代码] 方法一: public static Link reverseLinkList(Link head) ...

  10. JVM学习记录-Java内存模型(一)

    前言 Java虚拟机规范中定义了一种Java的内存模型,即Java Memoory Model(简称JMM),用来实现让Java程序在各个平台下都能达到一致的内存访问效果.JVM是整个虚拟机,JMM模 ...