想想那些年出现的面试题和自己对网上知识的理解

155 阅读6分钟

JavaScript 中的定时器有哪些?他们的区别及用法是什么?

1 setTimeout() 指定的毫秒数后调用函数或计算表达式

2 setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式不停地调用函数,直到clearInterval() 被调用或窗口被关闭

setTimeout 也叫定时器 setInterval 也叫计时器

比较 attachEvent 和 addEventListener?

attachEvent 只能在 IE 浏览器给标签绑定事件, 可以多次绑定

addEventListenerW3C 标准, 除 IE 浏览器使用, 它给标签绑定事件

 

document.write 和 innerHTML 的区别?

document.write 是直接写入到页面的内容流,写之前没有调用 document.open, 浏览器会自动调用 open。每次写完关闭之后重新调用该函数,会导致页面被重写

innerHTML 则是 DOM 页面元素的一个属性,将内容写入某个 DOM 节点,不会导致页面全部重绘

innerHTML 优于document.write原因在于更精确的控制要的刷新页面部分

 

什么是 window 对象?什么是 document 对象?

Window 对象表示浏览器中打开的窗口。

document 是 window 的一个对象属性。显示于窗口或框架内的一个文档。

Js 拖动的原理?

主要用一下三个属性

mousedown 鼠标按下事件

mousemove 鼠标移动事件

mouseup 鼠标抬起事件

当点击 dom 的时候,记录当前鼠标的坐标值,也就是 x、y 值,以及被拖拽的 dom 的

top、left 值,并且在鼠标按下的回调函数里添加鼠标移动的事件:

document.addEventListener("mousemove", moving, false)

和添加鼠标抬起的事件

document.addEventListener("mouseup",function() {

document.removeEventListener("mousemove", moving, false);}, false);

这个抬起的事件是为了解除鼠标移动的监听,因为只有在鼠标按下才可以拖拽,抬起

就停止不会移动了。

当鼠标按下鼠标移动的时候,记录移动中的 x、y 值,那么这个被拖拽的 dom 的 top 和

left 值就是:

top=鼠标按下时记录的 dom 的 top 值+(移动中的 y 值 - 鼠标按下时的 y 值)

left=鼠标按下时记录的 dom 的 left 值+(移动中的 x 值 - 鼠标按下时的 x 值);

 

 

 

描述浏览器的渲染过程,DOM 树和渲染树的区别

渲染过程:*

解析 HTML 构建 DOM(DOM 树),并行请求 css/image/js

CSS 文件下载完成,开始构建 CSSOM(CSS 树)

CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)

布局(Layout):计算出每个节点在屏幕中的位置

显示(Painting):通过显卡把页面画到屏幕上

  DOM 树 和 渲染树 的区别

DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素

渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性

 

如何最小化重绘(repaint)和回流(reflow)

什么是重绘****

当元素的一部分属性发生改变,如外观、背景、颜色发生改变,浏览器根据元素的新属性重新绘制,呈现新的外观

什么是回流****

引起布局变化则需要 DOM 树重新计算的过程

方法:

1 进行复杂操作时先将元素display:"none"隐藏,完成后在显示

2 创建多个 DOM 节点,使用DocumentFragment 创建完后一次性的加入 document,缓存 Layout 属性值。这样,多次使用 left 只产生一次回流

3 避免用 table 布局,table 元素一旦触发回流会导致所有元素回流

4 避免使用 css 表达式,因为每次调用都会重新计算值

5 尽量使用 css 属性简写

6 批量修改元素样式,用类名代替行内

Js 延迟加载的方式有哪些?

1 使用 setTimeout 延迟方法

2 在script中添加defer属性

3 async

4 动态创建 DOM 方式

5 script在页面底部引入

6 使用 jQuery 的 getScript()方法

 

IE 与标准事件模型有哪些差别?

Dom事件模型

addEventListener

不用on,函数或方法带有一个事件对象,有捕获阶段和冒泡阶段,可以用e.stopPropagation()阻止事件流

IE 事件模型

Type 带 on 字符串

包含冒泡阶段

typeof 和 instanceof 区别?

Typeof对象、数组、null 返回的值是 object。 instanceof可以检测  

 

js 使用 typeof 能得到的哪些类型?

typeof 只能区分值类型

typeof undefined // undefined

typeof null // object

typeof console.log // function

typeof NaN // number

 

解释一下什么是回调函数,并提供一个简单的例子?

如果一个函数的参数是函数,那么这个参数函数就叫回调函数

Let timer = setInterval(function(){}, 500)

这个function就是回调函数

什么是闭包?

闭包 = 函数 + 上下文引用

优缺点:

优点:避免变量污染

缺点:不会执行完函数直接销毁,等所有函数调用完才会销毁,会造成内存泄漏

如何解决,用完之后手动释放

 

什么是内存泄漏

函数动态开辟的内存空间,使用完毕后未释放,一直占据该内存单元,直到程序结束

哪些操作会造成内存泄漏?

1 setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏

2 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

3 垃圾回收器定期扫描对象,对象的引用数量为 0,那么该对象的内存即可回收

JS 内存泄漏的解决方式

1 global variables:对未声明的变量的引用在全局对象内创建一个新变量。在浏览器中,

全局对象就是 window。

2 JavaScript 文件开头添加 “use strict”

3 在使用完之后,对其赋值为 null

4 DOM 引用

 

说说你对原型(prototype)理解

通过原型可以实现对象的属性继承,扩展对象

 

介绍下原型链(解决的是继承问题吗)

每一个对象都有prototype属性,如果我们访问一个变量,就近原则,先访问自己,自己没有找原型,原型没有找原型的原型,直到原型链终点。 如果还找不到,属性则获取undefined,方法则报错xxx is not defined

 

常见的 js 中的继承方法有哪些

1、原型链继承

2、借用构造函数继承

3、组合继承

4、型式继承

5、寄生式继承

6、寄生组合式继承

ES6 的继承:

1 使用 class 构造一个父类

2 使用 class 构造一个子类,并使用 extends 实现继承,super 指向父类的原型对象

3 实例化对象

 

介绍 this 各种情况(必会)

this : 谁调用我,我就指向谁

1 普通函数 函数名() : window

2 对象方法 对象名.方法名() : 对象

3 构造函数 new 函数名() : new创建的实例对象

4 箭头函数没有this,外层有就是外层,没有就是window

5 使用 call 和 apply 调用时