虾皮前端面经
- JS 数据类型
- 如何判断数组
- Array.isArrray(obj);
- Object.prototype.toString.call() //[object Array]
- instanceOfa.proto===Array.prototype
- js实现对象的key和value反转
function reverseObject(obj) { const reversed = {}; for (const key in obj) { if (Object.hasOwnProperty.call(obj, key)) { const value = obj[key]; const type = typeof value; // 只有在值的类型为 string 或 number 时才进行反转 if (type === 'string' || type === 'number') { reversed[value] = key; } else { console.warn(`Value "${value}" with type "${type}" is not supported as a key.`); } } } return reversed; }
- Promise对象的状态
- 看代码写输出
new Promise((resolve, reject) => { console.log(1) resolve(true); console.log(2); throw new Error('err'); reject(false); console.log(3) }).catch(ex => console.log(ex)) .then(res => console.log(res))
- 答案是 1 2 true如果在 Promise 中先调用 resolve 方法,然后再调用 reject 方法,那么 reject 方法将会被忽略,因为 Promise 的状态一旦变为已解决(fulfilled),就无法再改变为被拒绝(rejected)。
- 思路题:promise对象如何判断他的状态(不知道啊。。。
- TS里interface和type的区别他们都可以用来描述对象的结构interface可以拓展,使用extends关键字可以继承其他接口type不支持继承,但是可以用联合类型和交叉类型等方式来组合现有的类型
- 如何只要title和 description
interface Todo { title: string; description: string; completed: boolean; createdAt: number; } // 只包含 title 和 description 字段的部分接口 type TodoTitleDescriptionOnly = Partial<Pick<Todo, 'title' | 'description'>>;
- 手写Pick
type Pick<T, K extends keyof T> = { [P in K]: T[P]; };
【Webpack】
- optimization
module.exports = { // 其他配置项... optimization: { splitChunks: { chunks: 'all', // 指定哪些模块会被拆分,默认值是 async,表示只会拆分异步加载的模块 minSize: 20000, // 模块最小大小,小于这个大小的模块不会被拆分,默认值是 30000 minChunks: 1, // 模块最少被引用的次数,只有被引用次数大于等于这个值的模块才会被拆分,默认值是 1 maxAsyncRequests: 5, // 按需加载的模块最大并行请求数,默认值是 5 maxInitialRequests: 3, // 初始加载时的模块最大并行请求数,默认值是 3 automaticNameDelimiter: '~', // 自动命名生成的文件名中,不同部分之间的分隔符,默认值是 ~ name: true, // 启用自动命名,默认值是 true cacheGroups: { vendors: { test: /[\/]node_modules[\/]/, // 匹配需要拆分的模块路径的正则表达式 priority: -10, // 缓存组的优先级,数值越大,优先级越高,默认值是 0 filename: 'vendors.js' // 拆分出来的文件名 }, default: { minChunks: 2, // 默认缓存组的模块最少被引用的次数,默认值是 2 priority: -20, // 默认缓存组的优先级,默认值是 -20 reuseExistingChunk: true // 允许复用已经存在的 chunk,默认值是 true } } } } };
webpack配置optimization详解_webpack optimization-CSDN博客
【HTML】
- script标签放在head和body的区别
- async defer属性
【计算机网络】
- https加密的基本流程
- 非对称加密的公钥和私钥分别存储在哪里 公钥存储在服务器上,并在数字证书中
- 数字证书的指纹是什么 对数字证书进行哈希,用于确保完整性,保证他没有被篡改
【package.json】/冷门啊。。。
- 文件里面有哪些内容
dependencies
、devDependencies
和peerDependencies
的区别dependencies: 这是项目运行时所需的依赖项,即使在生产环境中也需要。这些依赖项会被安装到 node_modules 目录中devDependencies: 这是开发阶段所需的依赖项,仅在开发时需要。比如测试框架、构建工具等。这些依赖项不会被部署到生产环境中。peerDependencies: 这是指定项目需要依赖的"对等"依赖项。意味着你的模块(库)需要和另一个模块(库)一起使用,但不会将这些依赖项安装到 node_modules 目录中。相反,它期望用户将这些依赖项安装到他们的项目中,以确保版本兼容性。在使用 npm install 命令时,dependencies 和 devDependencies 会一起安装,而 peerDependencies 则需要手动安装,或者由具体的包管理器(如 npm 或 yarn)处理。- main和module属性?(完全不知道呢! main 字段: 这是 package.json 文件中常见的字段,它指定了模块的入口文件。当你通过 require() 导入一个包时,会加载这个入口文件。module 字段: 这是用于指定模块的 ES Module 入口的字段。当在支持 ES Module 的环境中引入你的包时,会尝试加载这个字段指定的模块。exports 字段: 这是一个比较新的字段,用于指定模块的导出方式,可以指定不同环境下的导出。它允许你以更细粒度的方式控制模块的导出行为。dependencies 和 devDependencies 字段: 这些字段用于指定包的依赖项。dependencies 字段用于指定生产环境依赖,而 devDependencies 字段用于指定开发环境依赖。scripts 字段: 这个字段用于指定一些 npm 脚本,比如 start、test 等。
【手写】
- js实现二叉树找最大值(dfs