每日五道前端面试题--day6

以下题目来自掘金等其它博客,但是问题的答案都是根据笔者自己的理解做出的。如果你最近想要换工作或者巩固一下自己的前端知识基础,不妨和我一起参与到每日刷题的过程中来,如何?

第六天要刷的面试题如下:

  1. 延时加载js脚本的几种方法
  2. 类数组以及其转成数组的方法
  3. arguments的理解以及其遍历的方式
  4. 数组上有哪些方法?
  5. 位运算及应用,原码、反码、补码相关知识

下面是我自己的理解:

1. 延时加载js脚本的几种方法

  • defer属性:在script标签上写入defer标志,此脚本虽然会在文档解析的同时进行加载,但会等待文档解析完成之后才会执行。多个带defer标签的script标签都会在文档加载完毕之后按照在dom文档中的顺序从上到下依次执行,是有序的
  • async属性:在script标签上写入async标志,此脚本会在文档解析的同时进行加载,并且一旦加载完成就立即开始执行,同时阻塞文档的解析。多个带有async标志的script标签,因为网络原因加载时间是不能保证的,所以它们之间的执行顺序是不能够得到保证的
  • 动态标签:在某个时机(通常是某个事件发生之后),动态的创建script标签并设置其scr的值,设置之后浏览器会自动发送get请求获取对应的资源;加载完成并执行完毕之后会触发script标签对象的onload事件;加载失败执行的是onerror事件;
  • 异步执行:将一些脚本代码放到setTimeout的定时器中执行;
  • 调整位置:调整script标签在dom中的位置也可以改变script的执行时间。

2. 类数组以及其转成数组的方法

  • 类数组的本质是一个js中的对象;此对象有length属性 和一些索引属性 ,所谓的索引属性指的就是number类型的propertykey。但是如果使用Array.isArray来检验会得到false结果;
  • 常见的类数组包括普通函数的arguments对象,以及使用querySelector获取的NodeList对象;
  • 将类数组x变成真实数组的方法有:
    • Array.from(x)
    • [...x]
    • 此外,可以借助Array.prototype上的各类方法;这种方式的原理就是:由于x不是数组,但是可以假装x是数组,这样x就可以使用数组上的特定方法,这些特定的方法执行结果是数组 ;那么如何假装x是真的数组呢?使用Array.prototype.fnc就可以了,而数组构造函数原型对象 上能够返回数组的方法有:
      • slice
      • call
      • concat
      • forEach

于是:

  • Array.prototype.slice.call(x)
  • Array.prototype.call.call(x,0)
  • Array.prototype.concat.call(x,[])
  • Array.prototype.forEach.call(x,v=>v)
  • ...

3. arguments的理解以及其遍历的方式

  • 首先,arguments是类数组,原因是它具有length属性(表示实参/实际收到的的数目)和索引属性(表示实参序列)。但是无法通过Array.isArray的检测,并且不具有大部分数组方法。
  • 然后,arguments对象只存在于普通对象中,而在箭头函数中不存在;
  • 此外,arguments对象上的callee属性表示正在运行的函数,可以用做匿名函数的递归;
  • 最后,遍历类数组的方法大致可以分成两种,一个是转换为真正的数组,然后遍历 ,另外一个是嫁接数组上的方法进行遍历
  • 具体来说:Array.prototype.forEach.call(likeArray, cb)

4. 数组上有哪些方法,分类说明

  1. 数组转string: toString toLocalString join
  2. 元素操作: pop push shift unshift splice
  3. 排序和倒序: sort reverse
  4. 切片和填充: slice fill
  5. 归并和合并: reduce reduceRight concat
  6. 查找: find findIndex indexOf lastIndexOf includes
  7. 迭代: every some filter forEach map

5. js中的位运算和原码、反码、补码

  • 六种位运算:& | ~ ^ >> <<
  • 正数三码合一
  • 负数:反码是原码的符号位不动,其余位取反;补码是反码+1
  • +0和-0的补码是相同的
  • 使用位运算可以在一些特殊场景下使代码变得简单高效,包括:
    *
    1. 快速取整:x|0 或者 ~~x
      1. 判断奇偶: x&1
      1. 找到左侧偶数: x&(x-1) 下面第五种情况除外
      1. 除2并取整: x>>2 或者取平均数:(a+b)>>2
      1. 乘2并取整: x<<2
      1. 判断是否是2的幂次方: x&(x-1)是不是为0
      1. 交换x和y的值: 连续执行三次异或 a = a ^ b; b = a ^ b; a = a ^ b;
      1. 检查二进制的n位是否为1:x&(1<<n)的结果是否为0
      1. 判断两个数是否同正负:(a^b) > 0
      1. 权限控制,使用二进制的每一bit表示对某个权限的控制权,当二进制变成十进制之后,可以使用很小的数字表示很多权限
相关推荐
开心工作室_kaic41 分钟前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā41 分钟前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
沉默璇年2 小时前
react中useMemo的使用场景
前端·react.js·前端框架
yqcoder2 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
2401_882727572 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
SoaringHeart3 小时前
Flutter进阶:基于 MLKit 的 OCR 文字识别
前端·flutter
会发光的猪。3 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
天下代码客3 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js
猫爪笔记3 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
前端李易安4 小时前
Webpack 热更新(HMR)详解:原理与实现
前端·webpack·node.js