react中阻止事件默认行为:
- e.stopPropagation()
- e.preventDefault()
React为什么不要直接修改state?如果想修改怎么做
1.react 需要知道什么时候重新渲染组件以及如何更新界面。直接修改state会导致React无法正确追踪state更新。
Object.is()
推荐在reducer中触发Action吗?为什么?
reducer 应该是一个纯函数,代码逻辑应该限制在当前的reducer内,如果触发了action,可能会触发其他的reducer甚至再次触发自身,可能引起死循环或者不确定因素,违反了单一数据流原则。
react 生命周期
immutable数据
- 持久化数据,使用旧数据时,旧数据同时可用且不变,避免深拷贝把所有节点复制一遍带来的性能损耗。
- 使用了解构共享,如果对象树中一个节点发生变化,只修改这个节点和它受影响的父节点,其他节点共享。 juejin.cn/post/686383…
为什么属性使用className而不是class呢
class 是因为在JavaScript中, class 是一个保留关键字,不能直接使用
diff算法 - key 机制
-
diff算法,两颗虚拟DOM ,发生改变时只需要修改变更的部分,同层进行比较。
-
数组渲染出一个列表DOM,如果是触发了移动操作,比如将其中的某一个dom移动到最前面,如果有key就不会触发删除、重新创建操作,而是基于顺序进行移动,避免额外的性能消耗。
- 也同时引出为什么不要用index当key 如果使用index作为key,当发生移动操作,会出现 index相同,但对应的内容变更,这样会触发多次更新渲染文本,而如果使用唯一的key,只需要在同层级移动,不需要重新删除、创建
AST解析过程
- 词法分析。将源代码字符串分割成 词法单元(tokens)如(console.log--分割成console . log),标识符、关键字、运算符等。
- 语法分析。在语法分析阶段,词法分析生成的词法单元会被组织成语法结构即AST,语法分析器会根据语言语法规则构建AST。
- 语义分析。语义分析会进一步处理AST,检查语义正确性。通常包括类型检查、作用域分析、声明检查等。
- AST遍历和操作,AST构建完成后,就可以遍历,实现对代码的分析、转换和优化,通常采用dfs或者bfs的方式,对每个节点进行处理。
-
例子:
-
假设有一个简单的算术表达式
2 + 3 * 4,我们希望将这个表达式解析成AST。这个表达式的语法规则可以描述为: -
表达式由数字、运算符和括号组成。
-
乘法的优先级高于加法,即先计算乘法再计算加法。
根据这些语法规则,我们可以进行语法分析,将表达式 2 + 3 * 4 转换成AST。具体步骤如下:
-
词法分析:根据词法规则,将表达式拆分成词法单元(tokens):
- 数字:2
- 运算符:+
- 数字:3
- 运算符:*
- 数字:4
-
语法分析:根据语法规则构建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',然后将变量x和y相加并赋值给变量z。在这个代码片段中,存在一个语义错误,因为JavaScript不允许将一个数字和一个字符串相加。
语义分析的过程将会检测和报告这个错误,其具体步骤可能包括:
- 类型检查:语义分析器会检查变量的类型是否匹配,比如数字和字符串的相加操作是否合法。
- 作用域分析:分析器会检查变量的作用域,确保变量在使用前已经声明,并且在合适的作用域内。
- 声明检查:分析器会检查变量是否被正确声明,比如变量是否被多次声明或未声明就被使用等情况。
对于上面的代码片段,语义分析器可能会报告类似以下错误:
CopyInsert
Error: Cannot add a number and a string in line 3.
通过语义分析,我们可以发现代码中潜在的语义错误,帮助开发者在早期发现并纠正问题,提高代码的质量和可靠性。