我们每个人面试的时候,面试官都会问一些js基础的概念。比如说说你对闭包的理解,说说你对原型和原型链的理解,作用域和作用域链的理解,var、let、const的区别、promise的理解等等,相信这些概念性的东西,我们都能回答个八九不离十。
但如果面试官把这些概念性的问答,换成代码题让你来分析呢?是否还都能给出正确答案,并且说出为什么得出这个结果呢?
其实看代码,分析执行结果才是最考验人,是真是假一试便知啊。
作用域考察
下面代码输出什么?为什么?
如果这个题回答不准确,估计会被直接挂掉,毕竟太基础了。
第1题
var a=100 function f1(){ console.log(a) } function f2(){ var a=200 f1() } f2()
var a=100 function f1(){ console.log(a) } function f2(fn){ var a=200 fn() } f2(f1)
var a=100 function f2(){ var a=200 function f1(){ console.log(a) } retunr f1 } var f = f2() f()
闭包考察
第2题
let x = 1; function A(y){ let x = 2; function B(z){ console.log(x+y+z); //会输出什么? 为什么? } return B; } let C = A(2); C(3);
原型考察
第3题
var F = function () {} Object.prototype.a = function () {} Function.prototype.b = function () {} var f = new F()
请问f有方法a 方法b吗 为什么?
值传递问题
第4题
var a=100 var b={a:200} function f1(a1){ a1= -100 } function f2(b1){ b1.a= -200 } f1(a) //a f2(b) // b 请分析 f1 和 f2 函数执行后, a 和 b的值?为什么? 如果f2 改成下面的呢?f2 执行后 b 的值是什么? 为什么? function f2(b1){ b1 = { a:-200 } }
promise 考察
第5题
const promise = new Promise((resolve, reject) => { console.log(1); resolve(); console.log(2); reject('error'); }) promise.then(() => { console.log(3); }).catch(e => console.log(e)) console.log(4);
第6题
const promise = new Promise((resolve, reject) => { setTimeout(() => { console.log('once') resolve('success') }, 1000) }) promise.then((res) => { console.log(res) }) promise.then((res) => { console.log(res) })
第7题
Promise.resolve(1) .then(2) .then(Promise.resolve(3)) .then(console.log)
第8题
Promise.resolve(1).then((res)=>{ throw new Error('dd') },(error)=>{ console.log('error1',error) }).catch(e=>{ console.log('error2',e) })
Promise.resolve(1) .then((res)=>{ throw new Error('dd') },(error)=>{ console.log('error1',error) }) .then((res)=>{conso.log('ok')}, (error)=>{console.log('error2',error) }