2020 下半年 前端面試,是我遇到過的 (1)
阿新 • • 發佈:2020-12-28
前端
今天就寫一下,遇到過的前端面試題
- 有一個長度未知的陣列a,如果它的長度為0就把數字1新增到數組裡面,否則按照先進先出的佇列規則讓第一個元素出隊。
a.length===0?a.push(1):a.shift()
- JS 把url的引數解析成物件
getUrlKey('http//aaa/txt.php?a=1&b=2&c=3')
function getUrlKey(url){
let params={}
let urls=url.split('?');
let arr=urls[1].split('&');
for(let i= 0;i<arr.length;i++){
let a=arr[i].split('=');
params[a[0]]=a[1]
}
return params;
}
- 輸出下面console.log
var a = 10;
(function () {
console.log(a);
a = 20;
console.log(window.a);
var a = 30;
console.log(a)
})()
//結果:undefined 10 30
- 輸出下面console.log
let a = 1;
(function a(){
a = 2;
console.log(a);
})();
console.log(a);
//結果:
ƒ a(){
a = 2;
console.log(a);
}
1
//(function (){})() 是自執行函式
- 寫出下面的結果:
function Foo() {
this.a = function () {
console.log(1)
};
Foo.a = function () {
console.log(2)
}
}
Foo.prototype.a = function () {
console.log(3)
};
Foo.a = function () {
console.log(4)
};
Foo.a();
let obj = new Foo();
obj.a();
Foo.a();
// 結果:4 1 2
- 寫出下面的結果:
function Foo() {
getName = function () { alert (1); };
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//請寫出以下輸出結果:
Foo.getName();//2
getName();//4
Foo().getName();//1
getName();//1
new Foo.getName();//2
new Foo().getName();//3
new new Foo().getName();//3
- var s=“are you ok”,編寫js使變成are| you| okay|
function split(){
var str="are you okay",
res=""
var arr=str.trim().split(/\s+/)
for(i=0;i<arr.length;i++){
res+=arr[i]+"| "
}
return res;
}
- 寫一個按照下面方式呼叫都能正常工作的sum方法[curry]
console.log(sum(2,3))// 5
console.log(sum(2)(3))//5
function add() {
// 第一次執行時,定義一個數組專門用來儲存所有的引數
var _args = [].slice.call(arguments);
// 在內部宣告一個函式,利用閉包的特性儲存_args並收集所有的引數值
var _adder = function() {
_args.push(...arguments);
return _adder;
};
// 利用toString隱式轉換的特性,當最後執行時隱式轉換,並計算最終的值返回
_adder.toString = function () {
return _args.reduce(function (a, b) {
return a + b;
});
};
return _adder;
}
add(2,3);
add(2)(3);
- 下面的表示式執行得到什麼?
4+3+2+“1”
答案:“91”
4+3+2-“1”
答案:8
- 函式中的arguments是陣列嗎?若不是,如何將它轉化成真正的陣列?
不是陣列
function func(){
console.log(arguments);
return [ ].slice.call(arguments);
}
console.log(func(1,2,3))
- 下面這段程式碼執行輸出什麼,並闡明原因
var x=3;
var foo={
x:2,
baz:{
x:1,
bar:function(){
return this.x;
}
}
}
var go=foo.baz.bar;
console.log(go()); //第一個
console.log(foo.baz.bar()); //第二個
this的問題,
首先我們要看第一個,這時this指向的是window
其次看第二個,呼叫物件是foo.baz
所以這時this指向的是x:1
- 請問下面這段程式碼執行完輸出什麼,並闡述分析過程。
let x=0;
async function test(){
x+=await 2;
console.log(x);
}
test();
x+=1;
console.log(x);
//答案:1 , 2
這裡相關的就是同步還是非同步
我們程式執行的時候,一般是所有同步的都結束之後,
再執行微任務,然後巨集任務
所以asyn 這函式是需要後面執行的