(function(){
var a ={},push=[].push,i=0,b=function(){};
alert('length' in b)   //true 
for(;i++<20;){
push.call(a,i);
push.call(b,i);
}
alert(a[0]);   //undefine
alert(b[0]);   //不知道为什么函数的length只能为1
alert(b[1]);   //undefined
a.length = 0;  //非要加个length属性才行 不知道原因
i = 0;
for(;i++<20;){
push.call(a,i);
}
alert(a[0]);
alert(a[1]);  //可以一直用push方法
alert(a.length) 
alert([].join.call(a,'-'));//也能用数组的的一些方法

/*
个人理解 数组也好 对象也好
a[0] 事实上就是等同于 a.0(只是这样不符合语法规范)
也不知道这样理解对不对 -_-!.... 知道的同学们指点下.....
*/})();其实jq里面用到了很多这中写法   学不到精髓学点皮毛也是好的...........

解决方案 »

  1.   


    push用在数组中比较常见
    至于在对象中没有见到过a[0] 事实上就是等同于 a.0(只是这样不符合语法规范)
    这个是对象的属性,0是数字的所以a.0有时候得不到0属性的值,所以就用a[0]
    a = {name:'ss', 0:12}
    a['name'] or a.name 同理
      

  2.   

    call就是把函数中的this重新指定了。
    var a = {
        field: "a.field",
        func: function() {
            alert(this.field);
        }
    }var b = { field: "b.field" }
    a.func.call(b); // b.field
      

  3.   

    接个分.
    一般不会想到这么用.但理解的话,也容易接受.JS不是"一切都是对象"吗(怎么感觉好像跟JAVA搞混了,记忆又模糊了),数组对象,函数对象,类对象,在根上的"基类"都具有这个PUSH方法.
      

  4.   

    这里主要是阐述对数组的a[0]等同于a.0是否是这样
    对象的这种写法  估计不知道的人还是比较少的个人认为 代码就是让人看的云里雾里这个我真知道   -_-!我是标题党的党员你说的不对  push方法只在Array的prototype上 函数对象,类对象都没有
      

  5.   

    用 call 来改变函数执行的上下文,这个貌似…………
      

  6.   

    猜测..,因为不知道Array.prototype.push的实现var push = function(v){
       this[this.length++] = v;//这里需要对象拥有length属性 
    }var obj = {};
    obj.length = 0;push.call(obj,1);
    push,call(obj,2);alert(obj[0]);
    alert(obj['1']); //等同于obj[1],因为 对象[属性] 这种读取方式,属性可以是任意字符。而 对象.属性 这种方式,属性必须是有效变量名^[_a-z][a-z0-9]+$