百度问一问

百度问一问
最新回答
微笑就像创可贴゜

2023-11-17 18:06:20

以下是对相关问题的详细解答

1. 原型链顶端是什么

原型链顶端是Object.prototype。它是所有JavaScript对象的原型对象,包含了一些通用的方法和属性(如toString()、hasOwnProperty()等),这些方法和属性可以被所有JavaScript对象继承。因为Object.prototype位于原型链的最顶端,所以任何对象在访问属性或方法时,若自身不存在,就会沿着原型链向上查找,最终到达Object.prototype。

2. GET和POST区别
  • 数据传输位置

    GET:数据附加在URL的查询字符串(如?key1=value1&key2=value2)中,通过浏览器地址栏可见。

    POST:数据放在请求体(Request Body)中,不会显示在URL中。

  • 数据大小限制

    GET:受URL长度限制(通常约2048字符),不适合传输大量数据。

    POST:理论上无限制,适合传输大量或敏感数据。

  • 安全性

    GET:数据暴露在URL中,不适合传输敏感信息(如密码)。

    POST:数据在请求体中,相对更安全。

  • 缓存与书签

    GET:请求可被缓存或保存为书签。

    POST:请求通常不会被缓存或保存为书签。

3. POST的数据能不能放到URL中

可以,但通常不建议这样做。虽然POST请求的数据理论上可以附加到URL中(此时行为类似GET请求),但这违背了POST的设计初衷(数据应放在请求体中)。这样做会导致:

  • 安全性降低(数据暴露在URL中)。
  • 数据大小受URL长度限制。
  • 语义混乱(POST请求的URL应仅标识资源,而非包含数据)。
4. React中Prop和State区别
  • 用途

    Props:用于父子组件之间的数据传递,是只读的(子组件不应直接修改props)。

    State:用于管理组件内部的状态和数据,是可变的(通过setState或Hooks更新)。

  • 来源

    Props:由外部(父组件或全局状态)传入。

    State:由组件自身初始化亩备差和管理。

  • 使用场景

    Props:渲染静态迅皮数据(如配置项、父组件传递的初始值)。

    State:管理动态数据(如用户输入、定时器状态)。

5. React的Hooks

Hooks是React 16.8引入的特性,允许在不编写类组件的情况下使用状态和其他React特性。常见Hooks包括:

  • useState:管理组件状态。
  • useEffect:处理副作用(如数据获取、订阅)。
  • useContext:访问全局上下文。
  • useReducer:类似Redux的状态管理。
  • useRef:获取DOM引用或持久化值。
6. React如何避免组件重新渲染
  • 使用React.memo:对函数组件进行浅比较,避免不必要的渲染。
  • 使用useMemo:缓存计算结果,避免重复计算。
  • 使用useCallback:缓存函数引用,避免子组件因函数引用变化而重新渲染。
  • 合理拆分组件:将状态提升到需滚卖要它的最小组件范围内。
  • 使用Context或状态管理库(如Redux):避免状态变化导致全局重新渲染。
7. React中的Refs

Ref是用于访问组件中DOM元素或自定义组件实例的引用。通过React.createRef()或Hooks(useRef)创建,允许直接操作DOM(如聚焦输入框)或访问自定义组件的方法(需组件暴露方法)。

8. React的setState是同步还是异步,为什么

setState是异步的,原因如下:

  • 性能优化:批量更新状态,避免频繁重渲染。
  • 一致性维护:在事件处理函数和生命周期方法中,React会合并多个setState调用,确保状态更新的原子性。
  • 可通过useEffect或回调函数获取最新状态:若需基于最新状态操作,可使用setState的回调形式(类组件)或useEffect(函数组件)。
9. React中的组件通信
  • 父子组件

    父传子:通过props。

    子传父:通过回调函数(如onClick)。

  • 跨层级组件

    Context API:提供全局状态共享。

    状态管理库(如Redux、MobX):集中管理状态。

  • 兄弟组件

    通过共同父组件或状态管理库通信。

10. Redux工作流程
  1. Action:描述状态变化的普通对象(含type和payload)。
  2. Reducer:纯函数,接收当前状态和action,返回新状态。
  3. Store:保存全局状态,提供dispatch(触发action)和subscribe(监听状态变化)方法。
  4. 流程

    组件通过dispatch(action)触发状态更新。

    Reducer根据action计算新状态。

    Store更新状态并通知订阅者(如React组件)。

    组件通过connect或Hooks(如useSelector)获取最新状态。

11. Webpack打包优化配置
  • 代码分割

    使用SplitChunksPlugin拆分公共依赖。

    动态导入(import())实现按需加载。

  • 缓存

    配置output.filename含[contenthash],利用浏览器缓存。

  • Tree Shaking

    启用mode: 'production',移除未使用代码。

  • 性能优化

    使用DllPlugin预编译不常变更的依赖。

    缩小搜索范围(resolve.extensions、resolve.modules)。

12. Webpack配置多页面
  • 配置多个入口:entry: { page1: './src/page1.js', page2: './src/page2.js'},output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist')}
  • 使用HtmlWebpackPlugin为每个入口生成HTML文件:plugins: [ new HtmlWebpackPlugin({ template: './src/page1.html', filename: 'page1.html', chunks: ['page1'] }), new HtmlWebpackPlugin({ template: './src/page2.html', filename: 'page2.html', chunks: ['page2'] })]
13. JS数组方法:合并两个有序数组

使用merge算法或Array.prototype.concat()结合sort():

function mergeSortedArrays(arr1, arr2) { return [...arr1, ...arr2].sort((a, b) => a - b);}// 更高效的合并(时间复杂度O(n+m)):function mergeSortedArraysEfficient(arr1, arr2) { const result = []; let i = 0, j = 0; while (i < arr1.length && j < arr2.length) { if (arr1[i] < arr2[j]) { result.push(arr1[i++]); } else { result.push(arr2[j++]); } } return result.concat(arr1.slice(i)).concat(arr2.slice(j));}14. 算法题:拼接数组使结果最小

问题:输入一个正整数数组,将所有数拼接为一个字符串,打印最小的可能结果。解法

  1. 将数组转换为字符串数组。
  2. 自定义排序规则:比较a+b和b+a的字典序,按升序排列。
  3. 拼接排序后的字符串数组。
function minNumber(nums) { return nums.map(String).sort((a, b) => (a + b) - (b + a)).join('');}// 示例:// 输入:[10,2] → 排序后["10","2"] → 比较"102"和"210" → 输出"102"(错误,应返回"210")// 修正:需按字符串拼接后的字典序比较(改为(a + b).localeCompare(b + a))function minNumberCorrect(nums) { return nums.map(String).sort((a, b) => (a + b).localeCompare(b + a)).join('');}