感觉自己超常发挥了,面试官也比较认可自己,十有八九都回答上来了,就是对vue底层了解的不是太多,废话不多说了兄弟们,直接看题目吧,下面是我的答案,有争议的地方大家一起讨论
请写出下面 JS 程序中几个 alert 的结果: var a = 100; function fn() { alert(a); var a = 200; alert(a); } fn(); alert(a); var a; alert(a); var a = 300; alert(a);
解释:
fn()
内部第一次 alert(a)
输出 undefined
,因为 var a
在函数作用域内被声明(变量提升),但尚未赋值。alert(a)
输出 200
,因为 a
在函数内被赋值为 200
。alert(a)
输出 100
,因为 a
的值在全局作用域中没有改变。alert(a)
输出 100
,因为变量提升,var a
再次声明,但 a
的值仍为 100
。alert(a)
输出 300
,因为 a
重新赋值为 300
。题目二 请写出以下程序的输出 var obj1 = {name: 'obj1', fn: function() { console.log(this.name); }}; var obj2 = {name: 'obj2'}; var obj3 = {name: 'obj3'}; obj1.fn(); var newFn = obj1.fn; newFn(); newFn.call(obj2); obj3.fn = newFn; obj3.fn()
解释:
obj1.fn()
输出 obj1
,因为 this
指向 obj1
。newFn()
是直接调用函数,this
默认指向 window
(或 undefined
在严格模式下),所以输出 undefined
。newFn.call(obj2)
使用 call
方法将 this
绑定到 obj2
,输出 obj2
。obj3.fn()
在 obj3
上调用了 fn
,this
指向 obj3
,输出 obj3
。有字符串 var = 'abc345efgabcab',请写出 3 条 JS 语句分别实现如下 3 个功能(使用正则): 1)去掉字符串中的a、b、c 字符,形成结果:'345efg' 2)将字符串中的数字用中括号括起来,形成结果:'abc[345]efgabcab' 3)将字符串中的每个数字的值分别乘以 2,形成结果:'abc6810efgabcab'
var str = 'abc345efgabcab';
// 1) 去掉字符串中的 a、b、c 字符
var result1 = str.replace(/[abc]/g, '');
console.log(result1); // '345efg'
// 2) 将字符串中的数字用中括号括起来
var result2 = str.replace(/\d+/g, '[$&]');
console.log(result2); // 'abc[345]efgabcab'
// 3) 将字符串中的每个数字的值分别乘以 2
var result3 = str.replace(/\d/g, (match) => match * 2);
console.log(result3); // 'abc6810efgabcab'
console.log('a'); // 'a'
setTimeout(() => {
console.log('b'); // 'b' (最后执行)
}, 0);
console.log('c'); // 'c'
Promise.resolve().then(() => {
console.log('d'); // 'd' (微任务)
}).then(() => {
console.log('e'); // 'e' (微任务)
});
console.log('f'); // 'f'
输出顺序: 'a'
, 'c'
, 'f'
, 'd'
, 'e'
, 'b'
解释:
console.log('a')
和 console.log('c')
立即执行。setTimeout
回调函数放入宏任务队列中。Promise
的 then
回调放入微任务队列,先执行 'd'
和 'e'
。setTimeout
的回调 'b'
。先整理四道题目,后面还有四道,等我有空发布,感觉有帮助的小伙伴可以点个赞,follow一下,一起进步!
#腾讯面试##第一次面试##面经深度解析##机械制造笔面经##腾讯电竞#