Array 해석.prototype.slice.call(arguments,0)

4386 단어

Array.prototype.slice.call(arguments, 0)에서 함수를 처리하는 데 사용되는 이 코드를 자주 볼 수 있습니다


인터넷에 많은 복사 스티커가'Array'라고 적혀 있다.prototype.slice.ll(arguments)는length 속성을 가진 대상을 수조로 변환할 수 있다.IE 아래의 노드 집합을 제외하고(ie 아래의dom 대상은com 대상의 형식으로 이루어지기 때문에 js 대상과com 대상은 변환할 수 없다)

관건:


1. Array는 구조 함수


2,arguments는 클래스 그룹의 대상이다(많은 그룹이 부족한 방법)


3. 콜은 한 대상이 다른 대상을 호출하는 방법을 사용한다.계승을 위해 콜 () 을 사용할 수 있습니다. 하나의 방법을 쓰고 다른 대상을 계승할 수 있습니다. (새로운 대상에서 이 방법을 다시 쓰는 것이 아니라)


4,slice는 하나의 수조에서 절단하고 새로운 수조로 돌아가며 절단된 수조를 수정하지 않습니다


so, 사실 본질은arguments라는 대상이 수조의slice라는 방법을 사용하여 매개 변수로 구성된 수조를 얻었다는 것이다(apply도 사용할 수 있다).


Array.prototype.slice.call(arguments, [0, arguments.length])

// prototype Array 

Array.prototype.slice.call([1,2,3,4,5],0)//  [1, 2, 3, 4, 5]

[].slice.call([1,2,3,4,5],1)// [2, 3, 4, 5]


// length 
var a={length:2, 0:'first', 1:'second'};
Array.prototype.slice.call(a);//  ["first", "second"]

var a={length:2, 0:'first', 1:'second'};
Array.prototype.slice.call(a,1);//  ["second"]

var a={0:'first', 1:'second'};
Array.prototype.slice.call(a,1);//  []

slice 대략적인 내부 구현

Array.prototype.slice = function(start,end){
     var result = new Array();
     start = start || 0;
     end = end || this.length; //this , call , this , , 
     for(var i = start; i < end; i++){
          result.push(this[i]);
     }
     return result;
}

그룹 변환의 통용 함수

var toArray = function(s){
    try{
        return Array.prototype.slice.call(s);
    } catch(e){
            var arr = [];
            for(var i = 0,len = s.length; i < len; i++){
                   //arr.push(s[i]);
                   arr[i] = s[i]; //console.timeEnd push 
            }
             return arr;
    }
}

좋은 웹페이지 즐겨찾기