面试题输出打印结果总结

1.宏任务,微任务
async function async1() {
  console.log(1);
  const result = await async2();
  console.log(3);
}

async function async2() {
  console.log(2);
}

Promise.resolve().then(() => {
  console.log(4);
});

setTimeout(() => {
  console.log(5);
});

async1();
console.log(6);

输出的结果顺序为:1,2,6,4,3,5
题解:

  1. 首先js的函数执行是在调用的地方开始函数的执行,所以先跳过前两个 async 函数。
  2. 然后 promise 函数,因为Promise.then中注册的回调是异步执行的,所以应该将 4 放在微任务队列中
  3. 遇到setTimout,异步宏任务,放入宏任务队列中;
  4. 然后调用了async1(),async1() 中的 console.log(1);是同步执行的,所以首先打印了1 ,await 后面紧跟着async2 函数执行,所以打印了 2 ,async2 函数返回的 Promise ,所以 console.log(3) 放在微任务队列中,此时微任务队列中有【4,3】,接着执行了下一个同步任务 6
    此时同步任务已经执行完毕,我们去到异步的事件队列中找,先执行微任务,此时微任务中有【4,3】,所以打印接下来打印 43 ,微任务宏任务的打印顺序按照存储的顺序打印,所以 3 在 4 的后面
  5. 最后执行宏任务中的 5
2.对象作为key会转为[object,object]
let a = {a: 10};
let b = {b: 10};
let obj = {
  a: 10
};
obj[b] = 20;
console.log(obj[a]);

这道题的答案是:20
题解:

1.obj [ b ] = 20;
相当于 obj [ {b: 10} ] = 20;对象做为 key 时被强制转为了 [object,object],所以此时 obj 的值为:

 obj = {
     a: 10[object,object]:20
 };
  1. 打印 obj [a] 时,由于 a 是一个对象,所以被强制转换为了 **[object,object],**就相当于打印 obj[’[object,object]’],所以最后输出的结果为 20
3.关于堆栈内存
const a = {},b = 0,c = '0';
a[b] = "xu"
a[c] = 'ke'
console.log(a[b]) //ke

这一题答案是输出的 ke
对象中属性名不能重复,数字属性名会转换为字符串,所以a[c] 会把 a[b]覆盖掉

const a = {},b = symbol('0'),c = symbol(0);
a[b] = "xu"
a[c] = 'ke'
console.log(a[b]) //xu

考察的symbol数据类型,是es6中新出的数据类型,
每个Symbol实例都是唯一的,所以不会被覆盖

4.让条件成立

怎样让下面的成功的输出条件成立四个字
if(var i ==1 && i==2 &&i==3){console.log("条件成立!")}
方法1:
由于我们不确定i的类型,i可以为对象可以为字符串,当i和数字进行比较的时候首先调用自身的toString方法,再转换为number,再和数字进行比较,所以我们借助i的toString方法可以实现这个等式成立

var i = {
	j :1,
	toString(){
		return this.j++
	}
}
if(i==1 && i==2 && i==3){
	console.log("条件成立")
}

方法2:Object.defineProperty()
当我们访问或设置对象的属性的时候都会触发相对应的函数,然后在这个函数里返回设置属性的值
既然如此,我们当然可以在触发函数的时候动一些手脚做点我们自己想做的事情,这也就是“劫持”操作。

var j= 1
Object.defineProperty(window,'i',{
	get(){
		return j++
	}
	
})
if(i==1 && i==2 && i==3){
	console.log("条件成立")
}

方法3:根据 i 的toString 和数组的shift

const i = [1,2,3]
i.toString  = i.shift //每次i和数字进行比较都会调用自身的toString方法,i.shift删除并返回的数组的第一个元素,所以让每次的shift值给toString方法,可使得等式成立
console.log(i)
if(i==1&&i==2&&i==3){
	console.log("条件成立")
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值