面试题JavaScript篇(三)

目录

一、什么是防抖?什么是节流?

二、函数柯里化

三、js常见的设计模式

四、requestAnimationFrame

五、暂时性死区

六、setTimeOut第三个参数是什么

七、数组遍历方法

八、数组可以改变原数组的方法

九、不改变原数组的方法

十、foreach 和 map 有什么区别

十一、web worker是干什么的

十二、node 事件循环机制和浏览器事件循环机制有什么区别

十三、Reflect

十四、Object.keys和Object.getOwnPropertyNames有什么区别

十五、clientHeight、offsetHeight、scrollHeight有什么区别

十六、实现触底加载

十七、script标签里的defer 和 async


一、什么是防抖?什么是节流?

  • 防抖
    • 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)

五、暂时性死区

如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

在代码块内,使用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
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值