目录
十四、Object.keys和Object.getOwnPropertyNames有什么区别
十五、clientHeight、offsetHeight、scrollHeight有什么区别
一、什么是防抖?什么是节流?
- 防抖
- n秒后在执行该事件,若在n秒内被重复触发,则重新计时
- 节流
- n秒内只运行一次,若在n秒内重复触发,只有一次生效
手写防抖与节流:见=》JavaScript手写题_Kw_Chng的博客-优快云博客
二、函数柯里化
三、js常见的设计模式
单例模式、工厂模式、构造函数模式、发布订阅者模式、迭代器模式、代理模式
四、requestAnimationFrame
-
requestAnimationFrame请求数据帧
-
可以用做动画执行
-
可以自己决定什么时机调用该回调函数
-
能保证每次频幕刷新的时候只被执行一次
-
页面被隐藏或者最小化的时候暂停执行,返回窗口继续执行,有效节省CPU
var s = 0
function f() {
s++
console.log(s);
if (s < 999) {
window.requestAnimationFrame(f)
}
}
window.requestAnimationFrame(f)
五、暂时性死区
如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
在代码块内,使用let.const
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)
暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
变量没有声明之前使用,报错ReferenceError(ES6),而不是输出undefined(ES5)
变量声明之前,对变量使用typeof,报错ReferenceError。在没有let
之前,对变量使用typeof
运算符输出undefined,永远不会报错。
六、setTimeOut第三个参数是什么
可以作为参数传给函数,一般用于 for 循环赋值
七、数组遍历方法
reduce、map、filter、every、some、foreach
JavaScript------数组、字符串_Kw_Chng的博客-优快云博客
八、数组可以改变原数组的方法
Push、pop、shift、unshift、splice、sort、reverse
JavaScript------数组、字符串_Kw_Chng的博客-优快云博客
九、不改变原数组的方法
join 变成字符,Slice截取,concat 合并数组
JavaScript------数组、字符串_Kw_Chng的博客-优快云博客
十、foreach 和 map 有什么区别
foreach 没有返回值,一般如果用来遍历修改原数组的话可以用 foreach 方法
十一、web worker是干什么的
js是单线程的,而web worker可以多创建一个子线程,多出来的这个子线程执行代码时不会阻塞主线程。它有几个限制:
- 同源限制,子线程资源必须和主线程资源是同源
- dom限制,子线程不能操作dom
- 文件限制,不能打开本机(file://)文件,只能来源于网络
- 通信限制,只能使用postmessage来传输信息
- 脚本限制,不能使用alert、confirm方法
十二、node 事件循环机制和浏览器事件循环机制有什么区别
浏览器和 Node 环境下,microtask 任务队列的执行时机不同
- Node 端,microtask 在事件循环的各个阶段之间执行
- 浏览器端,microtask 在事件循环的 macrotask 执行完之后执行
十三、Reflect
Reflect可以提供一些方法去拦截js的操作,Reflect不是一个函数对象,所以它不可构造,Reflect内部的方法和属性都是静态的。
比如创建一个没有原型的对象,也就是说他自己不能调用任何基于Object原型链上的方法
var myObject = Object.create(null)
// 如果想列举它的key值,只需使用Reflect的静态方法,拦截该对象,然后做出处理
Reflect.ownKeys(myObject)
十四、Object.keys和Object.getOwnPropertyNames有什么区别
Object.keys只列出非原型上可枚举的key值,而Object.getOwnPropertyNames列出非原型上的所有key值(Symbol除外)
十五、clientHeight、offsetHeight、scrollHeight有什么区别
clientHeight
- 用户可见内部高度+padding
offsetHeight
- 总高度,算上滚动条
scrollHeight
- 可滚动高度的+padding
scrollTop
- 当前元素距离顶部的距
十六、实现触底加载
scrollTop + clientHeight >= scrollHeight - 50px
十七、script标签里的defer 和 async
script 标签是会阻塞 DOM 的解析的,所以我们要尽量不要把script 放到 head 里,要尽量放到 body 的最下方。这样不至于会有白屏的效果。
defer
- 给 script 标签添加 defer 属性,就不会阻塞 dom 的解析了,等 dom 渲染完之后才会运行该 js 代码,如果是多个 script 标签都添加了 defer 属性的话,那么它们是按照顺序执行的(第一个全部执行完毕之后才能执行第二个),defer 的 script 是在 DOMContentLoaded 之前运行的。
async
- 给 script 添加 async 属性之后,会异步下载 js 代码,等下载完成之后会立即运行js 代码。多个 script 标签同时设置了 async 是没有先后顺序的,谁先加载完谁就先运行。
- 如果 script 标签没有操作任何 dom 信息,且不彼此依赖的话,可以使用 async