IT이야기

Array.isArray와 instanceof Array 사용의 차이점

cyworld 2021. 4. 24. 09:50
반응형

Array.isArray와 instanceof Array 사용의 차이점


배열이 배열인지 객체인지 알아내는 방법에는 두 가지가 있습니다. 사용 typeof item === "object";배열이 자바 스크립트에 비교적 새로운 및 배열 객체의 프로토 타입이기 때문에 객체 및 배열에 대해 true를 반환합니다 (이 잘못을 말로 수도, 정정 해줘 주시기 바랍니다). 그래서 내가 아는 두 가지 방법은 Array가 Array인지 확인하는 것입니다.

해결책 1 :

Array.isArray(item);

해결 방법 2 :

item instanceof Array;

내 질문은 다음과 같습니다.

  1. 이 두 솔루션의 차이점은 무엇입니까?
  2. 이 두 가지 중 선호하는 솔루션은 무엇입니까?
  3. 처리 시간이 더 빠른 것은 무엇입니까?

1.이 두 솔루션의 차이점은 무엇입니까?

isArray 는 ES5 메서드이므로 이전 브라우저에서는 지원되지 않지만 객체가 Array인지 확실하게 결정합니다.

instanceof Array.prototype 이 객체의[[Prototype]]체인있는지 확인합니다. 인스턴스에 사용되는 Array 생성자가 테스트에 사용 된 것과 다를 가능성이 높기때문에 프레임에서 배열을 확인할 때 실패합니다.

2.이 두 가지 중 선호하는 솔루션은 무엇입니까?

"선호"는 몇 가지 선택 기준을 가정합니다. 일반적으로 선호되는 방법은 다음과 같습니다.

if (Object.prototype.toString.call(obj) == '[object Array]')

ES3 브라우저에 적합하고 여러 프레임에서 작동합니다. ES5 브라우저 만 고려한다면 isArray 는 괜찮을 것입니다.

3. 처리 시간이 더 빠른 것은 무엇입니까?

둘 다에 대한 처리 시간이 무시할 수 있기 때문에 거의 관련이 없습니다. 신뢰할 수있는 것을 선택하는 것이 훨씬 더 중요합니다. Array.isArray의 방법은 내장에 사용하지 않는 브라우저에 추가 할 수 있습니다 :

if (!Array.isArray) {
    Array.isArray = function(obj) {
      return Object.prototype.toString.call(obj) == '[object Array]';
    }
}

  1. 차이 사이 Array.isArray(item)item instanceof Array

    Felix Kling이 댓글에서 언급했듯이 instanceof Arrayiframe에서 작동하지 않습니다. 구체적인 예를 제공하려면 다음 코드를 시도해보세요.

    var iframeEl = document.createElement('iframe');
    document.body.appendChild(iframeEl);
    iframeArray = window.frames[window.frames.length - 1].Array;
    
    var array1 = new Array(1,1,1,1);
    var array2 = new iframeArray(1,1,1,1);
    
    console.log(array1 instanceof Array);  // true    
    console.log(Array.isArray(array1));  // true
    
    console.log(array2 instanceof Array);  // false    
    console.log(Array.isArray(array2));  // true    
    

    위의 예에서 볼 수 있듯이 iframe에서 Array 생성자로 생성 된 배열 (예 :) array2을 사용할 때 배열로 인식되지 않습니다 instanceof Array. 그러나를 사용할 때 배열로 올바르게 식별됩니다 Array.isArray().

    If you are interested in knowing why instanceof Array doesn't work across different globals (i.e. iframe or window), you can read more about it on here.

  2. Which of these two is the preferred solution?

    In most cases instanceof Array should be enough. However, since instanceof Array doesn't work correctly across iframes/window, Array.isArray() would be more robust solution.

    Make sure to check for browser compatibility though. If you need to support IE 8 or less, Array.isArray() won't work (see Mozilla's doc).

  3. Which has a faster process time?

    According to this jsperf, instanceof Array is faster than Array.isArray(). Which makes sense, because Array.isArray() performs more robust checking and therefore takes a slight performance hit.

ReferenceURL : https://stackoverflow.com/questions/22289727/difference-between-using-array-isarray-and-instanceof-array

반응형