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 调用时