有意思的前端函数面试题
生活随笔
收集整理的這篇文章主要介紹了
有意思的前端函数面试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1:考引用類型在比較運算符時候 隱式轉換會調用本類型那個方法 toString和valueOf?(去年過年吵的很火國外的題)
if(a == 1 && a == 2 && a == 3){console.log("我走進來了"); }<!--答案1:--> var a = {num:0}; a.valueOf = function(){return ++a.num }<!--答案2:--> var num = 1; function a(){return num++; } if(a() == 1 && a() == 2 && a() == 3){console.log("我走進來了"); }<!--答案3:-->var num = 0; Function.prototype.toString = function(){return ++num; } function a(){}<!--答案4:--> var a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)};復制代碼2:考this指向的理解?(最后一個輸出問題是借鑒網易面試題的)
var names = "宋偉老師"; var obj = {names:"張健老師",showName:function(){console.log(this.names);},returnName:function(){return this.names;},returnFunctionName:function(){return function(){console.log(this.names);}}} obj.showName(); //輸出什么? "張健老師" obj.returnName(); //輸出什么? "張健老師" obj.returnFunctionName()(); //輸出什么? "宋偉老師" obj.showName.call(names); //輸出什么? undefined obj.returnName.call(names); //輸出什么? undefined obj.returnFunctionName().call(names) //輸出什么? undefined var newObj = obj.returnFunctionName().bind(window); newObj.call(obj) //輸出什么? "宋偉老師" //為什么最后一個輸出"宋偉老師"?因為bind指向this對象后 再一次調用的話 this指向不會被改變//謝謝某同學慧眼發現了問題 name少了個s 統一都是names 復制代碼3:再來一次this指向問題?(能不看答案的同學說出結果 算我輸)
var big = "萬達老師";var obj = {big:"宋偉老師",showBig:function(){return this.big;} } obj.showBig.call(big); //? big() { [native code] } //精通String的操作方法的同學就把為什么回復出來吧復制代碼4:說出下面this長度是多少?(再來一把this指向 估計能把這都搞明白的同學 this指向應該沒有能難住的了)
function a(a,b,c){console.log(this.length); //4console.log(this.callee.length); //1 }function fn(d){arguments[0](10,20,30,40,50); }fn(a,10,20,30);//第一個輸出結果:因為this當前指向的是arguments 。 arguments是一個偽數組具備length屬性。arguments又是保存函數的實參。 fn調用的時候傳入4個實參。所以arguments長度為4。這個時候arguments[0] 等同于 arguments.a調用這個函數。所以this指向的是arguments這個偽數組也是(對象)(聽到這還有疑惑小伙伴留言問我)//第二個輸出結果:callee是arguments的一個屬性,主要返回當前arguments直屬的函數體。所以this.callees是返回fn 。每一個函數有一個length屬性主要用來返回函數的形參的所以就是1。 復制代碼5:經典的變量提升問題?
=================== 題一 =========================== if(!"abc" in window){var abc = 10; } console.log(abc); //undefined //因為先變量聲明提升 所以提升之后abc的值系統默認會賦值為undefined。 !abc為false ,in是檢查對象中是否存在某個屬性。很顯然 false屬于是一個布爾類型。不存在對象中。所以沒有走if里面的變量賦值。//對于wens同學提出的問題。我重新說明一下abc雖然聲明提升了。 但是 if里面判斷的是字符串abc。所以!"abc" 是false。 你可以嘗試if(!"abc"){var abc=10} console.log(abc); 再試試if(!abc){var abc=10} console.log(abc);看看結果是否一樣=================== 題二 =========================== console.log(a); //undefined if(!("a" in window)){var a = 10; } console.log(a); //undefined //因為先變量聲明提升 所以提升之后a的值系統默認會賦值為undefined。 變量提升會存在GO中也就是window。所以("a" in window)肯定為true。!去反一下就為false。所以不走賦值。 =================== 題三 =========================== var x = 1; if (function f(){}) { x += typeof f; } console.log(x); //1undefined //因為函數題在()中會以表達式去運行。最后轉換為true,不會存在函數整體聲明提升。所以typeof為undefined復制代碼6:面試幾率百分80%的題!
function fun(n,o) {console.log(o)return {fun:function(m){return fun(m,n);}}; } var a = fun(0); a.fun(1); a.fun(2); a.fun(3); //輸出什么 undefined 0 0 0 var b = fun(0).fun(1).fun(2).fun(3); //輸出什么 undefined 0 1 2 var c = fun(0).fun(1); c.fun(2); c.fun(3); //輸出什么 undefined 0 1 1//答案很顯而易見。換一個形式看著道題function fun(n,o) {console.log(o)return {fun:function(m){return fun(m,n);}}; } var a = fun(0); a.fun(1); a.fun(2); a.fun(3); //輸出什么 undefined 0 0 0 //fun(0)調用時候等同于 function fun(n,o) {var n=0;var o;console.log(o) //undefinedreturn {fun:function(m){return fun(m,n); ---> n 就獲取到fun里面的n為0的值。然后調用一次fun就會出現下面函數顯示。}}; } //a.fun(1)調用時候等同于fun(1,0) function fun(n,o) {var n=1;var o=0;console.log(o) //1return {fun:function(m){return fun(m,n); ---> n 就獲取到fun里面的n為0的值。}}; }//以此類推 不知道小伙伴們看懂沒 因為感覺語言解釋不如分化代碼理解好明白 復制代碼總結
以上是生活随笔為你收集整理的有意思的前端函数面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SCCM 2016 客户端硬/软件资产收
- 下一篇: HTTPS握手