js面试题整理

以下输出顺序为什么是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
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值