杂记-0407

64 阅读5分钟

react中阻止事件默认行为:

  1. e.stopPropagation()
  2. e.preventDefault()

React为什么不要直接修改state?如果想修改怎么做

1.react 需要知道什么时候重新渲染组件以及如何更新界面。直接修改state会导致React无法正确追踪state更新。

Object.is()

image.png

推荐在reducer中触发Action吗?为什么?

reducer 应该是一个纯函数,代码逻辑应该限制在当前的reducer内,如果触发了action,可能会触发其他的reducer甚至再次触发自身,可能引起死循环或者不确定因素,违反了单一数据流原则。

react 生命周期

juejin.cn/post/691411…

immutable数据

image.png

image.png

  1. 持久化数据,使用旧数据时,旧数据同时可用且不变,避免深拷贝把所有节点复制一遍带来的性能损耗。
  2. 使用了解构共享,如果对象树中一个节点发生变化,只修改这个节点和它受影响的父节点,其他节点共享。 juejin.cn/post/686383…

image.png

为什么属性使用className而不是class呢

class 是因为在JavaScript中, class 是一个保留关键字,不能直接使用

diff算法 - key 机制

  • diff算法,两颗虚拟DOM ,发生改变时只需要修改变更的部分,同层进行比较。

  • 数组渲染出一个列表DOM,如果是触发了移动操作,比如将其中的某一个dom移动到最前面,如果有key就不会触发删除、重新创建操作,而是基于顺序进行移动,避免额外的性能消耗。

image.png

  • 也同时引出为什么不要用index当key 如果使用index作为key,当发生移动操作,会出现 index相同,但对应的内容变更,这样会触发多次更新渲染文本,而如果使用唯一的key,只需要在同层级移动,不需要重新删除、创建

image.png

image.png

AST解析过程

  1. 词法分析。将源代码字符串分割成 词法单元(tokens)如(console.log--分割成console . log),标识符、关键字、运算符等。
  2. 语法分析。在语法分析阶段,词法分析生成的词法单元会被组织成语法结构即AST,语法分析器会根据语言语法规则构建AST。
  3. 语义分析。语义分析会进一步处理AST,检查语义正确性。通常包括类型检查、作用域分析、声明检查等。
  4. AST遍历和操作,AST构建完成后,就可以遍历,实现对代码的分析、转换和优化,通常采用dfs或者bfs的方式,对每个节点进行处理。
  • 例子:

  • 假设有一个简单的算术表达式 2 + 3 * 4,我们希望将这个表达式解析成AST。这个表达式的语法规则可以描述为:

  • 表达式由数字、运算符和括号组成。

  • 乘法的优先级高于加法,即先计算乘法再计算加法。

根据这些语法规则,我们可以进行语法分析,将表达式 2 + 3 * 4 转换成AST。具体步骤如下:

  1. 词法分析:根据词法规则,将表达式拆分成词法单元(tokens):

    • 数字:2
    • 运算符:+
    • 数字:3
    • 运算符:*
    • 数字:4
  2. 语法分析:根据语法规则构建AST。根据乘法优先级高于加法的规则,我们可以构建如下AST:

CopyInsert
    +
   / \
  2   *
     / \
    3   4

在这个AST中,乘法部分优先级高于加法,所以乘法部分的AST子树位于加法节点的右侧。

通过语法分析,我们成功将算术表达式 2 + 3 * 4 解析成AST,这个AST可以帮助我们理解表达式的结构和计算顺序,为后续的代码分析和优化提供基础。 语义分析(Semantic Analysis)是编译过程中的一个重要步骤,它主要负责检查代码的语义正确性,包括类型检查、作用域分析、声明检查等。下面通过一个简单的例子来说明语义分析的过程:

假设有一个简单的JavaScript代码片段如下:

CopyInsert
let x = 10;
let y = '20';
let z = x + y;

我们可以看到,变量x被赋值为一个数字10,变量y被赋值为一个字符串'20',然后将变量xy相加并赋值给变量z。在这个代码片段中,存在一个语义错误,因为JavaScript不允许将一个数字和一个字符串相加。

语义分析的过程将会检测和报告这个错误,其具体步骤可能包括:

  1. 类型检查:语义分析器会检查变量的类型是否匹配,比如数字和字符串的相加操作是否合法。
  2. 作用域分析:分析器会检查变量的作用域,确保变量在使用前已经声明,并且在合适的作用域内。
  3. 声明检查:分析器会检查变量是否被正确声明,比如变量是否被多次声明或未声明就被使用等情况。

对于上面的代码片段,语义分析器可能会报告类似以下错误:

CopyInsert
Error: Cannot add a number and a string in line 3.

通过语义分析,我们可以发现代码中潜在的语义错误,帮助开发者在早期发现并纠正问题,提高代码的质量和可靠性。