面試題目
這是搜狐JavaScript面試題,要求如下:
實現一個遍歷數組或對象里所有成員的迭代器。
var each = function(obj, fn){ //+++++++++++答題區域+++++++++++ //+++++++++++答題結束+++++++++++ }; try{ var data1 = [4,5,6,7,8,9,10,11,12]; var data2 = { "a": 4, "b": 5, "c": 6 }; console.group(data1); each(data1, function(o){ if( 6 == this ) return true; else if( 8 == this ) return false; console.log(o + ": \"" + this + "\""); }); console.groupEnd(); /*------[執行結果]------ 1: "4" 2: "5" 4: "7" ------------------*/ console.group(data2); each(data2, function(v, n){ if( 5 == this ) return true; console.log(n + ": \"" + v + "\""); }); console.groupEnd(); /*------[執行結果]------ a: "4" c: "6" ------------------*/ }catch(e){ console.error("執行出錯,錯誤信息: " + e); }
分析過程
分析如下:
要遍歷數組或對象成員,因此要對傳入對象進行判斷:
if(obj instanceof Array){ } else if(obj instanceof Object){ } else{ }
當傳入的是Array對象時,從調用和輸出可以看出,要用到call方法,並且第一個參數為數組的值,第二個參數為元素索引(從1開始),並且當返回值為false時,結束此過程。所以代碼如下:
if(obj instanceof Array){ for(var i=0,l=obj.length;i<l;i++){ var temp=fn.call(obj[i],i+1); if(temp === false){ return; } } }
當傳入的是一個對象時,要對對象成員進行遍歷,並且要傳入三個參數,第一個和第二個為成員值,第三個為成員名稱。所以代碼如下:
else if(obj instanceof Object){ for(var e in obj){ fn.call(obj[e],obj[e],e); } }
最后完整代碼如下:
var each = function(obj, fn){ //+++++++++++答題區域+++++++++++ if(obj instanceof Array){ for(var i=0,l=obj.length;i<l;i++){ var temp=fn.call(obj[i],i+1); if(temp === false){ return; } } } else if(obj instanceof Object){ for(var e in obj){ fn.call(obj[e],obj[e],e); } } else{ } //+++++++++++答題結束+++++++++++ };
小結
本面試題主要考查了 instanceof 的用法,call的用法,對數組的遍歷,對對象成員的遍歷等知識點。