["1","2","3"].map(parseInt)
parseInt:解析一个字符串,并返回十进制整数,第一个参数str,即要解析的字符串,第二个参数radix,基数(进制),范围 2-36;
代码解析:
const nums = ["1","2","3"];
nums.map((item,index)=>{
return parseInt(item,index);
//parseInt("1",0); //0 表示没有传递第二个参数,按照10进制处理,返回 1;
//parseInt("2",1); // 没有1进制,返回 NaN;
//parseInt("3",2); // 2进制没有3,返回 NaN;
})
数组转树;
const arr=[
{ id: 1 , name: '部门A', parentId:0},
{ id: 2 , name: '部门B', parentId:1},
{ id: 3 , name: '部门C', parentId:1},
{ id: 4 , name: '部门D', parentId:2},
{ id: 5 , name: '部门E', parentId:2},
{ id: 6 , name: '部门F', parentId:3},
]
function convert (arr){
let idToTreeNode=new Map();
let root = null;
arr.forEach(item=>{
const {id,name,parentId} = item;
//定义 treeNode 并加到map
const treeNode = {id,name};
idToTreeNode.set(id,treeNode);
//找到父节点,并加到父节点的children中
const parentNode=idToTreeNode.get(parentId);
if(parentNode){
if(parentNode.children==null) parentNode.children=[];
parentNode.children.push(treeNode);
}
//找到根节点
if(parentNode===0) root=treeNode;
})
}
树转数组;
function convert1 (root) {
const nodeToParent = new Map();
const arr = [];
const queue =[];
queue.unShift(root);//根节点入队
while(queue.length>0){
const curNode = queue.pop();//出队
if(curNode==null) = break;
const {id, name,children=[]} = curNode;
//创建数组item 并push
const parentNode = nodeToParent.get(curNode);
const parentId = parentNode?.id||0;
const item = {id, name,parentId};
arr.push(item);
//子节点入队
children.forEach(child=>{
//映射
nodeToParent.set(child,curNode);
//入队
quene.unShift(child)
})
}
}
当多个 promise 链式调用时,.then会交替执行,then 中返回 promise 实例,会"慢两拍"
React 的 setState
默认情况:默认异步更新,默认合并后更新;
不在 React 上下文触发,会同步更新:setTimeout,setInterval,promise.then;自定义 DOM 事件,Ajax 回调;(React18 之前:18 需要将 ReactDOM.rander 更改为 ReactDOM.createRoot 才会异步更新);
setState 传入函数不合并更新
react 的 setState 是宏任务还是微任务;
setState 是同步,只不过让 React 做成了异步的样子;以为要考虑性能,多次修改 state,只进行一次渲染;
对象和属性的连续赋值;
值类型存储在栈中;
引用类型:会在栈中建一个变量,指向堆中存储的数据;
连续赋值,倒序执行;
变量声明高于赋值的优先级;
- 读代码的面试题,要按照引擎执行代码去阅读.要分析本质去理解代码;