2012-01-25 3 views
16

I'v는 기본 객체에 배열의 프로토 타입을 적용하는 두 가지 건너 목적 :[] .slice 또는 Array.prototype.slice

type = Object.prototype.toString.call(obj); 
type = {}.toString.call(obj); 

간단한 테스트 :

function fn() { 
    console.log(
     Array.prototype.slice.call(arguments), 
     [].slice.call(arguments), 
     Object.prototype.toString.call(arguments), 
     {}.toString.call(arguments) 
    ); 
} 

fn(0,1); 

바이올린 : http://jsfiddle.net/PhdmN/

그들은 저와 동일하게 보입니다. 첫 번째 구문은 더 자주 사용되지만 두 번째 구문은 확실히 더 짧습니다. 더 짧은 구문을 사용할 때 단점이 있습니까?

+4

두 번째 구문은 불필요하게 새로운 개체를 만듭니다. –

+1

@ Dan.. 정답이므로 답변으로 게시해야합니다. ;) – Lucero

답변

25

기능면에서는 동일합니다.

그러나 Array 개체를 덮어 쓸 수 있으므로 첫 번째 방법이 실패 할 수 있습니다.

//Example: 
Array = {}; 
console.log(typeof Array.prototype.slice); // "undefined" 
console.log(typeof [].slice); // "function" 

리터럴 방법 (Array.prototype.있어서 대향) Array의 새로운 인스턴스를 생성한다. 당신이 염려되는 경우 -

  • var slice = Array.prototype.slice; //Commonly used
  • var slice = [].slice; : 두 방법의 벤치 마크 : http://jsperf.com/bbarr-new-array-vs-literal/3 당신이 방법을 여러 번 사용하는거야

    , 가장 좋은 방법은이 방법을 캐시하는 것입니다 Array이 있거나 짧은 구문을 좋아하는 경우

+1

아니요, 결과 만 같습니다. 아무 것도없는 새로운 객체를 만드는 것은 동일하지 않으며 프로토 타입을 명시 적으로 사용하는 것이 런타임이 메서드가있는 곳을 파악하는 데 필요한 작업이 적기 때문에 더 빠릅니다. 두 가지 모두 한계가 있지만 똑같이 사용하기 쉬운 경우 더 나은 솔루션을 선택하지 않는 이유는 무엇입니까? – Lucero

+0

@Lucero 그들은 기능에 대해 동일합니다. '[] .slice'는 (성능에 거의 영향을주지 않는) 새로운 인스턴스를 초기화합니다. 'Array' 메쏘드는 더 깨끗하지만'Array'가 재정의 될 때 실패합니다. JS의 –

+3

은 많은 것을 망칠 수 있습니다. 'Array.prototype.slice'가 변경되면 두 변형 모두 예상대로 동작하지 않습니다. 다시 정의 된 '정의되지 않은 것'을 생각 나게합니다. 어쨌든 객체를 생성하는 것은 비용이 많이 들지 않지만 가비지 콜렉션의 비용을 감안할 때 꽉 짜낼 수 있습니다. – Lucero

관련 문제