以下题目来自掘金等其它博客,但是问题的答案都是根据笔者自己的理解做出的。如果你最近想要换工作或者巩固一下自己的前端知识基础,不妨和我一起参与到每日刷题的过程中来,如何?
第六天要刷的面试题如下:
- 延时加载js脚本的几种方法
- 类数组以及其转成数组的方法
- arguments的理解以及其遍历的方式
- 数组上有哪些方法?
- 位运算及应用,原码、反码、补码相关知识
下面是我自己的理解:
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. 数组上有哪些方法,分类说明
- 数组转string: toString toLocalString join
- 元素操作: pop push shift unshift splice
- 排序和倒序: sort reverse
- 切片和填充: slice fill
- 归并和合并: reduce reduceRight concat
- 查找: find findIndex indexOf lastIndexOf includes
- 迭代: every some filter forEach map
5. js中的位运算和原码、反码、补码
- 六种位运算:
& | ~ ^ >> <<
- 正数三码合一
- 负数:反码是原码的符号位不动,其余位取反;补码是反码+1
- +0和-0的补码是相同的
- 使用位运算可以在一些特殊场景下使代码变得简单高效,包括:
*- 快速取整:x|0 或者 ~~x
-
- 判断奇偶: x&1
-
- 找到左侧偶数: x&(x-1) 下面第五种情况除外
-
- 除2并取整: x>>2 或者取平均数:(a+b)>>2
-
- 乘2并取整: x<<2
-
- 判断是否是2的幂次方: x&(x-1)是不是为0
-
- 交换x和y的值: 连续执行三次异或 a = a ^ b; b = a ^ b; a = a ^ b;
-
- 检查二进制的n位是否为1:
x&(1<<n)
的结果是否为0
- 检查二进制的n位是否为1:
-
- 判断两个数是否同正负:
(a^b) > 0
- 判断两个数是否同正负:
-
- 权限控制,使用二进制的每一bit表示对某个权限的控制权,当二进制变成十进制之后,可以使用很小的数字表示很多权限