以下输出顺序为什么是0,1,2,3,4,5,6,7
setTimeout(() => {
console.log(7);
});
Promise.resolve()
.then(() => {
console.log(0);
return Promise.resolve(4);
})
.then((res) => {
console.log(res);
});
Promise.resolve()
.then(() => {
console.log(1);
})
.then(() => {
console.log(2);
})
.then(() => {
console.log(3);
})
.then(() => {
console.log(5);
})
.then(() => {
console.log(6);
});
参考https://juejin.cn/post/6844903692752142343
首先要理解,Promise回掉函数的执行是异步的,但Promise本身的定义是同步执行,
其次,Promise回调的优先级是高于setTimeout等异步操作的,所以promise resolve会先于seTtimeout输出。浏览器会将promise callbacks加入到同步事件队列的末尾,而不是异步事件的队列。
macro-task(宏任务)大概包括:script(整体代码), setTimeout, setInterval, setImmediate(NodeJs), I/O, UI rendering。(优先级由高到低)
micro-task(微任务): process.nextTick(NodeJs), Promise, Object.observe(已废弃), MutationObserver(html5新特性) 。(优先级由高到低)
以下输出顺序?
console.log("start",(new Date()).getTime());
setTimeout(()=>{
console.log("setTimeout",(new Date()).getTime());
},0);
new Promise(((resolve)=>{
console.log("Promise",(new Date()).getTime());
resolve();
})).then(()=>{
console.log("Promise1",(new Date()).getTime());
}).then(()=>{
console.log("Promise2",(new Date()).getTime());
});
console.log("end",(new Date()).getTime());
//顺序如下
start 1621474441415
Promise 1621474441433
end 1621474441434
Promise1 1621474441436
Promise2 1621474441436
setTimeout 1621474441439
1.字符串去重
let str="hellowrd";
let arr=str.split("");
let newArr=[]
let obj=arr.reduce((prev,elem)=>{
if(prev[elem]===undefined){
prev[elem]=1;
newArr.push(elem)
}else{
prev[elem]+=1;
}
return prev
},{})
//方式二:
// 字符串去重
let str = 'aabbccddefetgrgdf';
let set1 = new Set(str);
let res = [...set1].join('');
console.log(res);
2.数组去重
var arr = [1, 2, 3, 4, 45, 1, 2, 3, 5, 7];
let set = new Set(arr);
// let res = Array.from(set);
let res = [...set]
console.log("***", res);
3.深克隆
let obj={a:"111",b:{c:"ddd"}};
let newObj=Object.assign({},JSON.parse(JSON.stringify(obj)))
4.生成1-100的数组
let arr1=new Array(10).fill(0).map((_,i)=>i+1)
let arr2=Array.from({length:10}).fill(0).map((_,i)=>i+1)
let arr3=Array.from({length:10},(_,i)=>i+1)
let arr4=Array.apply(null,{length:10}).map((_,i)=>i+1)
5.一下输出?
let arr=[27.2,0,'0013','14px',123];
arr=arr.map(parseInt) //输出?
// parseInt(27.2,0)//27
// parseInt(0,1)//null
// parseInt('0013',2)//1
// parseInt('14px',3)//1
// parseInt(123,4)//27
6. a=?
a=?
if(a==1 && a==2 &&a==3){
console.log("OK***********")
}
解法一:重写toPrimitive,valueOf,toString
var a={
i:0,
[Symbol.toPrimitive](){
return ++this.i
}
}
解法二:
let a=[1,2,3];
a.toString=a.shift();
解法三:数据劫持
let i=0;
Object.defineProperty(window,'a',{
get(){
return ++i
},
})
树形数据转树形结构
transListToTreeData (list, rootValue) {
var arr = []
list.forEach(item => {
if (item.parentId === rootValue) {
arr.push(item)
item.children = this.transListToTreeData(list, item.cmId)
}
})
return arr
}