[code:js]
typeof maybeArray ==  "Array"; // 에, 농담이시죠?
maybeArray instanceof Array; // 어쩌면요
maybeArray.constructor == Array; // 어쩌면요
typeof maybeArray.sort == 'function'; // 비슷합니다
Object.prototype.toString.call(maybeArray) === '[object Array]'; // 딩 동 댕

자바스크립트를 처음 접하는 사람들은 어떤 객체가 실제로 배열인지 아닌지 알아내는 간단한 방법이 있을 것이라고 생각합니다. 고수들은 저 너머에 있는 위험을 알고 있습니다. 특히, 프레임 사이를 탐색하며 작업할 때의 문제를 말이죠. 자바 진영은 클래스 로더에 이런 문제가 있었는데, 다른 클래스 로더로부터 객체를 가져올 때 이상한 문제가 일어나곤 했습니다.

Kangax씨는 이 문제에 대해 자세히 다루며 기술적으로 새로운 해결책을 제시했습니다. 덕분에 Prototype과 그 외의 라이브러리들이 그들의 코드를 덕 타이핑에서 다음 코드로 바꿀 수 있게되었습니다.

[code:js]
function isArray(o) {
    return Object.prototype.toString.call(o) == '[object Array]';
}

from isArray: Why is it so bloody hard to get right?
Posted by 행복한고니 트랙백 1 : 댓글 3

댓글을 달아 주세요

  1. addr | edit/del | reply BlogIcon Gloridea 2009.01.13 10:50

    오오, 안그래도 이 문제 관련한 포스팅을 한 번 하려고 했었는데... 훨씬 좋은 글이 있었군요. -ㅅ- 소개 감사~

  2. addr | edit/del | reply 웹디황용 2009.01.16 17:05

    이런좋은방법이

  3. addr | edit/del | reply BlogIcon Naztica 2009.01.27 19:14 신고

    오늘 시간 나서 테스트 해봤는데...
    여전히 IE에서는 multi-frame 이슈가 해결되지 않네요... orz.

Andrea Giammarchi씨가 크로스 브라우징을 지원하는 네이티브 array wrapper를 작성했습니다:

올해에 몇번이나 JavaScript Ninja들이 성능 손실이 없으면서도 강력한 메소드를 가진 라이브러리를 만들기 위해 네이티브 Array의 확장을 시도했었는지 모르겠습니다. 제가 마침내 Internet Explorer 8에서 크기 잠금을 제거하고 모든 다른 브라우저에서의 문제점을 해결할 방법을 찾아냈습니다.

그가 완성한 Stack 클래스입니다:

[code:js]
/**
* Choose a name for subclassed Array
*/
Stack = (function(){ // (C) Andrea Giammarchi - Mit Style License

    /**
     * Your personal Array constructor
     */
    function Stack(length){
        if(arguments.length === 1 && typeof length === "number")
            this.length = -1 <length && length === length <<1>> 1 ? length : this.push(length);
        else if(arguments.length)
            this.push.apply(this, arguments);
    };

    // Solution 1:
    //      Declaration of generic function
    //      with an array as prototype
    function Array(){};
    Array.prototype = [];

    // Solution 2:
    //      use the prototype chain to inherit
    //      Array constructor and its native prototype
    Stack.prototype = new Array;

    // Solution 3:
    //      overwrite inherited length with zero value
    Stack.prototype.length = 0;

    // Solution 4:
    //      redeclare toString method in this way
    //      to let JScript core feel better
    Stack.prototype.toString = function(){
        return  this.slice(0).toString();
    };

    /**
     * Return and assign subclassed Array
     */
    Stack.prototype.constructor = Stack;
    return  Stack;

})();

from Stack : A native Array wrapper that works on Ajaxian
Posted by 행복한고니 트랙백 0 : 댓글 0

댓글을 달아 주세요