面试题-202107

404 阅读8分钟

是什么

收集 整理一些代码块,面试题,强化理解记忆

题目

  1. 验证参数是数字
  2. 禁用网页中的右键单击
  3. 什么是 AJAX
  4. 如何取消 Promise 请求
  5. 如何取消 Axios 请求
  6. promises 和 observables 有什么区别
  7. 你如何创建复制到剪贴板按钮
  8. 获取时间戳的快捷方式是什么
  9. 你如何展平多维数组
  10. 多条件检查
  11. 捕获浏览器后退按钮
  12. 什么是包装对象
  13. 什么是最小超时限制
  14. 什么是微任务
  15. 什么是事件表
  16. 如何在 typescript 文件中使用 javascript 库
  17. 什么是 Babel
  18. Node.js 是完全单线程的吗
  19. 什么是 RxJS
  20. 什么是短路状态
  21. 什么是异步函数
  22. 如何在 javascript 中使对象可迭代
  23. 如何检查一个对象是否是一个 Promise
  24. arguments 对象和 rest 参数之间有什么区别
  25. 什么是内置可迭代对象
  26. for…of 和 for…in 语句之间有什么区别
  27. 如何在没有任何额外括号的情况下调用 IIFE
  28. 忽略 promise 错误的最简单方法是什么
  29. 如何正则表达式校验
  30. 用 react 开发的时候,什么时候用函数组件,什么时候用类组件呢
  31. 如何做自适应图片布局

验证参数是数字

function isNumber (n) {
  return !isNaN(parseFloat(n)) && isFinite(n)
}

禁用网页中的右键单击

<body oncontextmenu="return false">

你如何创建复制到剪贴板按钮

document.querySelector('#copy').onclick = function () {
  document.querySelector('input').select()
  document.execCommand('copy')
}

什么是 AJAX

异步获取数据的技术,我们可以在不刷新页面的情况下获取到数据

如何取消 Promise 请求


1. 返回 pending 状态 可以取消请求

Promise.resolve().then((res)=> {
	console.log("执行")
	return new Promise(()=>{})
}).then(() => {
    // 后续的函数不会被调用
    console.log('ok2')
}).catch(err => {
    console.log('err->', err)
})

2. 通过  throw 'throw error1' 取消
Promise.resolve().then(() => {
    console.log('ok1')
    throw 'throw error1'
}).then(() => {
    console.log('ok2')
}, err => {
    // 捕获错误
    console.log('err->', err)
}).then(() => {
    // 该函数将被调用
    console.log('ok3')
    throw 'throw error3'
}).then(() => {
    // 错误捕获前的函数不会被调用
    console.log('ok4')
}).catch(err => {
    console.log('err->', err)
});

如何取消 Axios 请求

1. 第一种通过CancelToken.source工厂方法创建cancel token

var CancelToken = axios.CancelToken;
var source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function(thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // 处理错误
  }
});

// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');


2. 通过传递executor函数到CancelToken的构造函数来创建cancel token

var CancelToken = axios.CancelToken;
var cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // executor 函数接收一个 cancel 函数作为参数
    cancel = c;
  })
});

// 取消请求
cancel();

promises 和 observables 有什么区别


promises

一次只发出一个值
立即调用
Promise 总是异步的,即使它立即解决了
不提供任何操作符
不能取消, 只能模拟异常取消

observables

在一段时间内发出多个值(从 0 到多个的值流)
天性懒惰;他们需要调用订阅
Observable 可以是同步的也可以是异步的
提供map、forEach、filter、reduce、retry、retryWhen等操作符
使用 unsubscribe() 方法取消

获取时间戳的快捷方式是什么

var _date = +new Date()
var _date = Date.now()

你如何展平多维数组

const _array = [11, [22, 33], [44, 55], [66, 77], 88, 99]
const flattenArr = [].concat(..._array) // [11, 22, 33, 44, 55...

多条件检查


if(["val1","val2"].indexOf(input) !==-1) {
	....
}

捕获浏览器后退按钮

// 捕获浏览器后退按钮事件
window.onbeforeunload = function () {
	....
};

什么是包装对象?

nullundefined 之外的每个原语都有包装对象,包装对象列表是 StringNumberBooleanSymbolBigInt

什么是最小超时限制

浏览器和 NodeJS javascript 环境都会以大于 0 毫秒的最小延迟进行节流,即使设置 0 毫秒的延迟也不会立即发生。由于大于 0ms 的最小延迟,您不能使用 setTimeout(fn, 0) 立即执行代码。但是您可以使用 window.postMessage() 来实现此行为。

什么是微任务


微任务:是当前插队执行的任务,微任务执行完成后立即执行 回主任务 javascript 代码。微任务在执行的时候,主线程将被阻塞,直到微任务队列为空。

微任务的主要来源是 Promise.resolvePromise.rejectMutationObserversIntersectionObservers 等。

什么是事件表

事件表是一种 数据结构,用于存储和跟踪将在一段时间间隔后或在某些 API 请求解析后异步执行的所有事件。即,每当您调用 setTimeout 函数或调用异步操作时,它都会被添加到事件表中。

它不会自行执行功能。事件表的主要目的是跟踪事件并将它们发送到事件队列。

如何在 typescript 文件中使用 javascript 库


并非所有 JavaScript 库或框架都有 TypeScript 声明文件。但是如果你仍然想在我们的 TypeScript 文件中使用库或框架而不会出现编译错误,唯一的解决方案是declare关键字和变量声明。

什么是 Babel

Babel 是 js 转译器,可以把es2015+ 的代码转换成,向后兼容的js 代码

Node.js 是完全单线程的吗

Node 是单线程的,但是 Node.js 标准库中包含的一些函数(例如 fs 模块函数)不是单线程的。即,它们的逻辑在 Node.js 单线程之外运行,以提高程序的速度和性能。

什么是 RxJS

RxJS (Reactive Extensions for JavaScript) 是一个使用 observables 实现反应式编程的库,它可以更容易地编写异步或基于回调的代码。它还提供了用于创建和使用 observable 的实用函数。

什么是短路状态

if 的精简模式,由于逻辑运算的从左向右的性质,if 可以 flag && go();

什么是异步函数

异步函数是一个用async关键字声明的函数,它以更简洁的风格编写异步的。这些函数可以包含零个或多个await表达式。

如何在 javascript 中使对象可迭代

可以通过Symbol.iterator在其上定义属性来使对象可迭代。

const collection = {
 one: 1,
 two: 2,
 three: 3,
 [Symbol.iterator]() {
   const values = Object.keys(this);
   let i = 0;
   return {
     next: () => {
       return {
         value: this[values[i++]],
         done: i > values.length
       }
     }
   };
 }
};

const iterator = collection[Symbol.iterator]();

console.log(iterator.next());    // → {value: 1, done: false}
console.log(iterator.next());    // → {value: 2, done: false}
console.log(iterator.next());    // → {value: 3, done: false}
console.log(iterator.next());    // → {value: undefined, done: true}

如何检查一个对象是否是一个 Promise

function isPromise (object) {
  return Boolean(object && typeof object.then === 'function')
}

arguments 对象和 rest 参数之间有什么区别


1.arguments 对象是一个类似数组的对象,但不是一个数组。而rest 参数是数组实例。
2.arguments 对象不支持 sort、map、forEach 或 pop 等方法。而这些方法可用于rest 参数。
3.rest 参数只是那些没有被赋予单独名称的参数,而参数对象包含传递给函数的所有参数

什么是内置可迭代对象


1.数组和类型数组
2.字符串:迭代每个字符或 Unicode 代码点
3.Maps:迭代其键值对
4.集合:迭代它们的元素
5.参数:函数中类似数组的特殊变量
6.NodeListDOM 集合

for…of 和 for…in 语句之间有什么区别


1. for..in 迭代对象的所有可枚举属性键
2. for..of 迭代可迭代对象的值。

如何在没有任何额外括号的情况下调用 IIFE

立即调用函数表达式(IIFE)需要一对括号来包装包含语句集的函数。由于 IIFEvoid 运算符都会丢弃表达式的结果,所以可以改成:

void function(dt) {
 console.log(dt.toLocaleTimeString());
}(new Date());

忽略 promise 错误的最简单方法是什么

await promise.catch(e => void e)

如何使用 CSS 设置控制台输出的样式

console.log(
  '%cThis is a red text with bigger font',
  'color:red; font-size:20px'
)

如何正则表达式校验


a — 匹配一个字符a(不能匹配 b,  aa等等.)
abc — 匹配 a, 其次 b, 最后  c.
a* — 匹配0个或者多个字符 a (+ 代表至少匹配一个或者多个).
[^a] — 匹配一个字符,但它不能是a.
a|b — 匹配一个字符 a 或者 b.
[abc] — 匹配一个字符,它可以是a,b或c.
[^abc] — 匹配一个字符,但它不可以是a,b或c.
[a-z] — 匹配字符范围 a-z且全部小写  (你可以使用 [A-Za-z] 涵盖大小写, 或 [A-Z] 来限制必须大写).
a.c — 匹配字符 a,中间匹配任意一个字符,最后匹配字符 c.
a{5} — 匹配字符 a五次.
a{5,7} — 匹配字符 a五到七次,不能多或者少.

用 react 开发的时候,什么时候用函数组件,什么时候用类组件呢


1. 能用函数就用函数;Hooks 对于逻辑的拆分重组比 class 方便得多;
2. 如果不影响 DOM 层级,代码行数到一定量级能拆组件尽量拆;
3.Error Boundary 的需求的话,这个是 hooks 目前做不到的,只能通过 HoC 或者 class component4. 反正现在已经没有 class XXX extend React.Component 这样的习惯了,起手全都是 function

如何做自适应图片布局

图片自适应、宽高比不变,不影响其他布局

.img-wrapper {
  position:relative;
  width: 100%;
  padding-bottom: 75%;
}

.img-wrapper img {
  position:absolute;
  width: 100%;
  height: 100%;
}