参考
<script>
function listArg2() {    
    alert(arguments.constructor); // Object

alert(Array.prototype.slice.call(arguments).constructor); // Array
}listArg2("a", "b", "cd");</script>

解决方案 »

  1.   

    <script language="JavaScript">
    function listArg2() {  
    var str="1,2,3";  
        for(var arg in str) {
            document.write(arg + ", ");
        }
    }listArg2()
    </script> 很简单的一个就不能用
      

  2.   

    chinmo給出的例子值得商榷!字符串在JS中本身就具有length屬性,你給出的例子最終的結果其實也證明它確實是可以for in的,只是那個arg是length.
      

  3.   

    首先在js中系统对象是原生属性是不能被列举的:
    for(var i in Array){
        alert(Array[i]);
    }
    但用户自定义属性可以被列举
    //demo1
    Array.a=1;
    Array.b=2
    Array.c=3;
    for(var i in Array){
        alert(Array[i]);
    }//demo 2
    var obj={};
    obj.name="obj";
    obj.a=function(){alert("here")};for(var i in obj){
        alert(obj[i]);
    }//demo 3 除了1,2,3你不能列举出join,push,pop这些系统方法
    var a=[1,2,3];
    for(var i in a){
       alert(a[i]);
    }
    所以想先写个不能被for in的对象不可能实现能被列举是因为调用Array.prototype.slice后将arguments的值赋值给了一普通数组
    两者不是以回事
    function listArg2() {
        //a与arguments 不是同一个对象
        var a=Array.prototype.slice.call(arguments)
        alert(arguments);
        alert(a);
    }listArg2("a", "b", "cd");
      

  4.   

    for in 只能用于对象,不能用于数组
    用数组的都报错.
    arguments是数组
    Array.prototype.slice.call(arguments)只是把数给变成对象而已,没什么复杂的.
      

  5.   

    其实应该这样
    function listArg2() {    
        var arr = Array.prototype.slice.call(arguments);//把arguments转成数组
    for(var arg in arr) {
            document.write(arr[arg] + ", ");
        }
    }listArg2("a", "b", "cd");不过这里巧合arguments[arg] == arr[arg]而已
      

  6.   

    小弟测试了一下var a="a,v,d,a,e"
        function b(){
    document.write(Array.prototype.slice.call(arguments))
    }
    b(a); ff和ie都显示a,v,d,a,e 
    var a="a,v,d,a,e"
        function b(){
    document.write(Array.prototype.slice.call(a))
    }
    b();  ie显示为,,,,,,,, ff显示为a,,,v,,,d,,,a,,,e
    这样有点好奇怪
      

  7.   

    var a="a,v,d,a,e"
        function b(){
            document.write(Array.prototype.slice.call(arguments))
        }
        b(a);这个是直接输出a传递过来的值至于用在字符串的情况还真不清楚
      

  8.   


    更正一下,以免误人啊
     for in 又能用于对象,又能用于数组 
    Array.prototype.slice.call(arguments)只是把对象数给变成数组而已;
    不能用
    aa = arguments;这个也会报错,因为你用的还是同一个对象, 
     系统对象不能被列举.xingqiliudehuanghun是对的..
      

  9.   


    弄清楚一点了由于字符串有length所以Array.prototype.slice.call(a)确实能返回length个元素的数组
    但由于在ie中字符串不能用a[0]这种方法取值所以返回的是“length个值为空的元素的数组”
    而ff是可以a[0]这样取值的所以元素就有值了
      

  10.   

    a,,,v,,,d,,,a,,,e
    其实是数组
    ["a",",","v",",","d",",","a",",","e"]
      

  11.   

    这样可以自定义一个能用于Array.prototype.slice的结构:
    var a = {}a[0] = "a";
    a[1] = "b";
    a[2] = "c";a.length = 3;var arr=Array.prototype.slice.call(a);document.write(arr);我想
    可以用length属性来说明元素个数
    [索引]来说明元素值
    的结构就可以用Array.prototype.slice转换成数组
      

  12.   


    我给你的例子能用for in??
    汗!那你运行看看能出结果不
      

  13.   


    Prototype有自己的$A 不过没有用这个方法, 不知道为什么?
    function $A(iterable) {
      if (!iterable) return [];
      if (iterable.toArray) return iterable.toArray();
      var length = iterable.length, results = new Array(length);
      while (length--) results[length] = iterable[length];
      return results;
    }
      

  14.   


    我想
    1是写Prototype那时候还不知道或不清楚这个方法所以没使用
    2是这个方法本身有什么缺陷我没发现
      

  15.   

    小弟测试过用Array.prototype.join.call也可以 但是为什么?
    var a = {}a[0] = "a";
    a[1] = "b";
    a[2] = "c";a.length = 3;var arr=Array.prototype.join.call(a);
    document.write(arr);
      

  16.   


    这个确实能运行
    不过是在ff引用winter别不相信,下面的代码在ie系列中会导致内存泄露var s=”lalala”;
    alert(s.length);
    s本身是一个string而非object,它没有length属性,所以当访问length时,JS引擎会自动创建一个临时String对象封装s,而这个对象一定会泄露。
    这个bug匪夷所思,所幸解决起来相当容易,记得所有值类型做.运算之前先显式转换一下:
    var s="lalala";
    alert(new String(s).length);
      

  17.   


    join返回的是字符串不是数组了
      

  18.   

    好像只能允许数字形式的key  
    var a={name:"蓝色",age:10}; a[0] = "a";
    a[1] = "b";
    a[2] = "c";
    a[7]="aqq"
    a.length =88;var arr=Array.prototype.slice.call(a);alert(arr);这样就不行了