# 【字节跳动】前端面试题总结 ## 看代码说结果 ### 代码输出结果1 ```js console.log(['1', '2', '3'].map(parseInt)) ``` ``` [1, NaN, NaN] ``` ### 代码输出结果2 ```js let [a = 1, b] = [] console.log(a, b) ``` ``` 1 undefined ``` ### 代码输出结果3 ```js Promise.resolve() .then(() => { Promise.resolve() .then(() => { console.log(1) }) .then(() => { console.log(2) }) }) .then(() => { console.log(3) }) ``` ``` 1 3 2 ``` ### 代码输出结果4 ```js const obj = { 3: '3', 2: 2, 1: '1', name: 'name', age: 'age' } console.log(Object.keys(obj)) ``` ``` ['1', '2', '3', 'name', 'age'] ``` ### 代码输出结果5 ```js let myArray = {} myArray['0'] = 'a' myArray['1'] = 'b' myArray.length = 2 console.log(...myArray) ``` ``` ``` ### 代码输出结果6 ```js console.log([1, 2, 3, 4, 5].splice(1, 2, 3, 4, 5)) console.log([1, 2, 3, 4, 5].slice(1, 2, 3, 4, 5)) ``` ``` [2, 3] [2] ``` ### 代码输出结果7 ```js console.log([].constructor === Array) console.log(typeof [] === 'array') console.log(typeof null === 'object') console.log('' instanceof Object) ``` ``` true false true false ``` ## 问答题 ### HTTP缓存的请求头与响应头有哪些 - 强制缓存 - 响应头: Expires 与 Cache-Control - Expires 绝对时间 - Cache-Control 相对时间 - 协商缓存 - 响应头: Etag 请求头: If-Non-Match - 响应头: Last-Modified 请求头: If-Modified-Since ### 宏任务与微任务有哪些区别?简述他们的应用场景 宏任务与微任务优先级不同 - 先执行同步代码,后执行异步代码 - 主线程代码执行完毕后,检查微任务队列是否为空,非空则优先执行微任务 - 每次执行宏任务之前,都会检查微任务队列是否为空,非空则优先执行微任务 常见的宏任务与微任务 - 宏任务 `script` `setTimeout` `setInterval` `postMessage` `MessageChannel` `setImmediate (NodeJS)` - 微任务 `Promise.then` `Object.observe` `MutationObserver` `process.nextTick (NodeJS)` ## 算法 中文数字转为阿拉伯数字 给定一个字符串,返回该字符串的所有组合 ```js 输入 abc 输出 ['abc', 'acb', 'bac', 'bca', 'cab', 'cba'] ``` 回溯算法