前端面試題:如何使用ES5 實現Array.from()

GeekQiaQia發表於2019-04-11

類陣列轉換為陣列實現

基礎知識:

  • Array 是陣列類;
  • slice(start,end)是此類中的方法;
  • 類中呼叫slice()方法,應該是Array.prototype.slice(start,end);

call([thisObj[,arg1[arg2[[argN]]]]])

params:
    thisObj是一個物件的方法 
    arrg1~argN是引數
複製程式碼

實現原理: Array.prototype.slice.call(argument);能將length屬性的物件,轉化為陣列,除了IE下的節點集合;因為IE下的dom物件是以com物件的形式實現的,JS物件和com物件不能進行轉換;

var a={length:2,0:'first',1:'second'};//類陣列,有length屬性,長度為2,第0個是first,第1個是second
console.log(Array.prototype.slice.call(a,0));// ["first", "second"],呼叫陣列的slice(0);

var a={length:2,0:'first',1:'second'};
console.log(Array.prototype.slice.call(a,1));//["second"],呼叫陣列的slice(1);

var a={0:'first',1:'second'};//去掉length屬性,返回一個空陣列
console.log(Array.prototype.slice.call(a,0));//[]

function test(){
  console.log(Array.prototype.slice.call(arguments,0));//["a", "b", "c"],slice(0)
  console.log(Array.prototype.slice.call(arguments,1));//["b", "c"],slice(1)
}
test("a","b","c");
複製程式碼

將引數轉換為陣列的方式

  • Array.from(arrayLike);
  • Array.prototype.slice.call(arguments);
  • [].slice.call(arguments,0);
  • function ArrayTransfer(...args){ var args=[]; for(var i=0;i<arguments.length;i++){ args.push(arguments[i]); } }

參考 www.cnblogs.com/dingxiaoyue…

相關文章