用下面的方法是有缺陷的,尽管得到一个Array,但是已经不是原来的Array了,等于Copy一个新的,而不是引用原来的地址。
var a = [].concat(window.opener.a); // 上面拼错了

解决方案 »

  1.   

    其实不奇怪呀,
    窗口1中数组对象怎么可能是窗口2中的数组类实例化的呢!1.html
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
            <title>Untitled Document</title>
        </head>
    <script>
    var a = [1,2];
    function isInstanceofArray(o){
    return(o instanceof Array);
    }
    alert(isInstanceofArray(a));
    </script>
        <body>
    <a href="2.html" target="_blank">Test</a>
        </body>
    </html>2.html
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
            <title>Untitled Document</title>
        </head>
        <body>
    <script>
    document.writeln(window.opener.isInstanceofArray(window.opener.a)); 
    </script>    </body>
    </html>
      

  2.   

    to syukugai:我的理解是,任何数组应该都是 Array 的实例,难道不对吗?
      

  3.   


    现在我的问题是
    我需要在2.htm调用1.htm中的一个数组a,a用于传递给一个方法进行处理(假定为X()方法),X()是封装好的,我无权修改,而且X()只接受一个Array参数,所以我不得不想办法把 window.opener.a 转换为一个 Array,就出现了以下的写法: 
    var a = [].concat(window.opener.a); 虽然这种写法暂时地解决了问题,但终归不是正道。
      

  4.   

    <script defer>
    document.writeln(window.opener.a instanceof window.opener.Array);
    </script>
      

  5.   


    问题的关键是,
    两个窗口中的Array不是一个东西呀.
    对于计算机来说他不会像人一样根据名字就识别出对象的类型的.
    这要从计算机内部对象实例化的实现来讲起了.
    通俗的讲,实例化对象差不多就是类描述代码的一个引用.
    关于这个问题我也表达不清楚.
    楼主最好去看看面向对象编程方面的资料.
      

  6.   


    楼主这样做之后,实际上是在本地生成了一个数组.
    本地的数组当然也是由本地的Array实例化的了.
    不过这确实是不安全.
    如果窗口中的 a 不是数组的话,就可能出问题.
    你4楼方法不行吗?
      

  7.   


    1.htm
    <script>
    var a = [10,20];
    </script> 
    <a href="#" onclick="window.open('2.htm')">Test</a>2.htm
    <script>
    alert(opener.a[0])
    //document.writeln(window.opener.a instanceof Array);
    </script>
      

  8.   

    很简单的问题楼主想的复杂了,清楚 target="_blank" 和 window.open 就可以了
      

  9.   

    这个问题是事实存在的,而且目前我找不到解决方法。我将问题重新整理如下:
    创建两个 HTM 页面如下: 1.htm 
    <script>
    var a = [];
    //alert(a instanceof Array);
    </script>
    <a href="2.htm" target="_blank">Test</a>2.htm 
    <script>
    var a = window.opener.a;
    X(a);  // 这里会捕获到一个异常。
    function X(arg) // X 是一个类库中的方法,我无权对其进行修改。
    {
        if (arg instanceof Array) throw new Error("arg must be an array.");
        //.....
    }</script>当执行 2.htm 中的 X(a) 时捕获到一个异常 - "arg must be an array."。
    这里的问题核心是,window.opener.a 为什么执行 instanceof Array 会失败呢。我暂时的解决方法是
    var a = [].conact(window.opener.a);但这肯定不是一个解决办法,因为这里的a已经不是引用原来的a的指针地址了, 当需要对a自身进行编辑时,这样的解决方案便无能为力。
      

  10.   

    但这肯定不是一个解决办法,因为这里的a已经不是引用原来的a的指针地址了, 当需要对a自身进行编辑时,这样的解决方案便无能为力。
    我只要求能够解决这个问题。
      

  11.   

    to syukugai:Array 是 ECMAScript 范畴的内容,而 window 是 BOM 范畴的。因此应该不存在 window.Array 这样的东西吧??
    (尽管你没有说 window.Array ,但是我觉得你是按照 window.Array 来理解这个问题的)
      

  12.   

    这样应该是可行的:
    <script type="text/javascript">
    document.writeln(/array/i.test(window.opener.a.constructor));
    </script>
    虽然constructor是 function Array(),却不能==Array,只能加上窗口范围==window.opener.Array,确实头一次发现! 
      

  13.   


    window.opener.Array?FF下的吗?我这里IE6测试不通过。
      

  14.   

    不管能不能用window.opener.Array来判断啊,我现在问题的关键在于我要得到一个真正 Array 类型的 a,因为判断部分是在X()中做的,我无权修改X
      

  15.   

    我上面贴了啊:
    document.writeln(/array/i.test(window.opener.a.constructor));
      

  16.   


    判断其实不是我关心的。我关心的是怎么得到一个 a 可以通过X()验证的!X()中有类似这样的判断:
    function X(arg) // X 是一个类库中的方法,我无权对其进行修改。
    {
        if (arg instanceof Array) throw new Error("arg must be an array.");
        //.....
    }
      

  17.   


    判断其实不是我关心的。我关心的是怎么得到一个 a 可以通过X()验证的!X()中有类似这样的判断:
    function X(arg) // X 是一个类库中的方法,我无权对其进行修改。
    {
        if (arg instanceof Array) throw new Error("arg must be an array.");
        //.....
    }
      

  18.   

    我这边测试IE6,8,FF3,Opera,Chrome,Netscape,Mozilla,Safari,都可以:1.html<script>
    var a = [];
    </script> 
    <a href="#" onclick="window.open('2.html')">Test</a>2.html<script>
    document.writeln(/array/i.test(window.opener.a.constructor));
    document.writeln(window.opener.a.constructor==window.opener.Array);
    </script>
      

  19.   

    晕还真有 window.Array 这样的东西
      

  20.   

    哦,没看到你这句!那你这样:var x = Array.prototype.slice.call(window.opener.a,0);document.writeln(x.constructor==Array);document.writeln(x instanceof Array);
      

  21.   


    没注意到你的终极需求!试试这样:1.html<script type="text/javascript">
    var a = [1,2];
    </script>
    <button onclick="a=(a.length==2)?[2,0,1,5,6]:[1,2];">Reset Array</button>
    <a href="#" onclick="window.open('2.html')">Test</a>
    2.html<script>var x = function(){
    return Array.prototype.slice.call(window.opener.a,0);
    }document.writeln(x().constructor==Array);document.writeln(x() instanceof Array);</script><button onclick="alert(x());">Show Array</button>
      

  22.   

    var x = function(){
        return Array.prototype.slice.call(window.opener.a,0);
    }
    document.writeln(x instanceof Array);依然是false
      

  23.   

    Kiu~~~``` IE下Array.prototype.slice.call(window.opener.a,0);有点问题,那就改成你那样好了:1.html<script type="text/javascript">
    var a = [1,2];
    </script>
    <button onclick="a=(a.length==2)?[2,0,1,5,6]:[1,2];">Reset Array</button>
    <a href="#" onclick="window.open('2.html')">Test</a>
    2.html<script>
    var x = function(){
    return [].concat(window.opener.a);
    }document.writeln(x().constructor==Array);document.writeln(x() instanceof Array);</script><button onclick="alert(x());">Show Array</button>