1. 程式人生 > 其它 >2020 下半年 前端面試,是我遇到過的 (1)

2020 下半年 前端面試,是我遇到過的 (1)

技術標籤:前端面試前端面試

前端

今天就寫一下,遇到過的前端面試題

  1. 有一個長度未知的陣列a,如果它的長度為0就把數字1新增到數組裡面,否則按照先進先出的佇列規則讓第一個元素出隊。
a.length===0?a.push(1):a.shift()
  1. 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; }
  1. 輸出下面console.log
 var a = 10;
    (function () {
        console.log(a);
         a = 20;
        console.log(window.a);
        var a = 30;
        console.log(a)
    })()
   //結果:undefined 10 30
  1. 輸出下面console.log
    let
a = 1; (function a(){ a = 2; console.log(a); })(); console.log(a); //結果: ƒ a(){ a = 2; console.log(a); } 1 //(function (){})() 是自執行函式
  1. 寫出下面的結果:
  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
  1. 寫出下面的結果:
	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
  1. 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;
}

  1. 寫一個按照下面方式呼叫都能正常工作的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);

  1. 下面的表示式執行得到什麼?
	4+3+2+1”

	答案:“914+3+2-1”

	答案:8
  1. 函式中的arguments是陣列嗎?若不是,如何將它轉化成真正的陣列?
    不是陣列
function func(){
console.log(arguments);

return [ ].slice.call(arguments);
}
console.log(func(1,2,3))
  1. 下面這段程式碼執行輸出什麼,並闡明原因
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
  1. 請問下面這段程式碼執行完輸出什麼,並闡述分析過程。
let x=0;

async function test(){

	x+=await 2;
	console.log(x);
}

test();
x+=1;
console.log(x);

//答案:1 , 2

這裡相關的就是同步還是非同步

我們程式執行的時候,一般是所有同步的都結束之後,

再執行微任務,然後巨集任務

所以asyn 這函式是需要後面執行的