# 一些有趣的题目

# Q1. 请说出以下代码的执行顺序

new Promise(res=>{
    res(1)
    Promise.resolve().then(()=>console.log(2))
    console.log(4)
}).then(console.log)
console.log(3)

要弄懂这道题首先必须明白Promise.then回调是异步执行。js引擎遇到第一个.then,由于是异步的,把事件推进队列,即console.log(2),遇到console.log(4)同步代码立即执行,输出4,遇到第二个.then推进队列,即console.log(1),遇到console.log(3)同步代码立即执行。同步代码执行完毕,队列里的事件先进先出,所以答案是4321关于Promise.then回调为何是异步执行请戳 (opens new window)

# Q2. 浏览器环境执行下面的代码会输出什么(谷歌)


const a = { a:1,b(){ console.log(this.a) } };
( a && a.b )()  

逻辑运算符返回的是指定操作数的this发生改变指向window,由于const是块级作用域,变量a不会挂载到window上,所以输出undefined如果改为var定义a,那么会输出a这个对象

# Q3. 执行下面的代码输出什么(hosting)


fn()

var fn

function fn(){
    console.log(1)
}

fn = function fn(){
    console.log(2)
}

fn()

输出1,2

# Q4. 以下代码中,p.__proto__等于什么?Person.__proto__等于什么?


function Person(name) {
    this.name = name
}
let p = new Person('Tom');

Person.prototype , Function.prototype

# Q4拓展


var foo = {},
F = function(){};
Object.prototype.a = 'value a';
Function.prototype.b = 'value b';

console.log(foo.a)   
console.log(foo.b)    
console.log(F.a)      
console.log(F.b)  

value a , undefined , value a , value b