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

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

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

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

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

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

  4. 数组上有哪些方法?

  5. 位运算及应用,原码、反码、补码相关知识

下面是我自己的理解:

  • defer属性:在script标签上写入defer标志,此脚本虽然会在文档解析的同时进行加载,但会等待文档解析完成之后才会执行。多个带defer标签的script标签都会在文档加载完毕之后按照在dom文档中的顺序从上到下依次执行,是有序的

  • async属性:在script标签上写入async标志,此脚本会在文档解析的同时进行加载,并且一旦加载完成就立即开始执行,同时阻塞文档的解析。多个带有async标志的script标签,因为网络原因加载时间是不能保证的,所以它们之间的执行顺序是不能够得到保证的

  • 动态标签:在某个时机(通常是某个事件发生之后),动态的创建script标签并设置其scr的值,设置之后浏览器会自动发送get请求获取对应的资源;加载完成并执行完毕之后会触发script标签对象的onload事件;加载失败执行的是onerror事件;

  • 异步执行:将一些脚本代码放到setTimeout的定时器中执行;

  • 调整位置:调整script标签在dom中的位置也可以改变script的执行时间。

  • 类数组的本质是一个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)

  • ...

  • 首先,arguments是类数组,原因是它具有length属性(表示实参/实际收到的的数目)和索引属性(表示实参序列)。但是无法通过Array.isArray的检测,并且不具有大部分数组方法。

  • 然后,arguments对象只存在于普通对象中,而在箭头函数中不存在;

  • 此外,arguments对象上的callee属性表示正在运行的函数,可以用做匿名函数的递归;

  • 最后,遍历类数组的方法大致可以分成两种,一个是转换为真正的数组,然后遍历,另外一个是嫁接数组上的方法进行遍历

  • 具体来说:Array.prototype.forEach.call(likeArray, cb)

  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

  • 六种位运算:& | ~ ^ >> <<

  • 正数三码合一

  • 负数:反码是原码的符号位不动,其余位取反;补码是反码+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表示对某个权限的控制权,当二进制变成十进制之后,可以使用很小的数字表示很多权限

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Web面试那些事儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值