关闭

伪数组

947人阅读 评论(0) 收藏 举报
分类:

1.符合以下条件的对象成为伪数组;

a.具有length属性;
b.按索引方式储存数据;
c.不具有数组的push,pop等方法;
如: function 内的 arguments;

var fakeArray01 = {0:'a',1:'b',length:2};//这是一个标准的有伪数组对象

2.伪数组的实现;

var fakeArray01 = {a:'a',b:'b',length:2};//没有length下标对应的值
var arr01 = Array.prototype.slice.call(fakeArray01);
alert(arr01[0]);//undefined

var fakeArray02 = {0:'a',1:'b',length:'num'};//length不是数值
var arr02 = Array.prototype.slice.call(fakeArray02);
alert(arr02[1]);//undefined

3、伪数组的 slice 的内部实现过程为:

function slice(start, end) {
    var len = ToUint32(this.length), result = [];
    for(var i = start; i < end; i++) {
        result.push(this[i]);
    }
    return result;
}

   可以看出,slice 并不需要 this 为 array 类型,只需要有 length 属性即可。并且 length 属性可以不为 number 类型,当不能转换为数值时,ToUnit32(this.length) 返回 0.


根据以上结论可以得出:fakeArray01被转换成了lenth为2的数组,其值都被初始化为undefined,fakeArray02被转换成了length为0的数组,自然访问下标为1的元素返回undefined

可以通过Array.prototype.slice.call(fakeArray)将伪数组转变为真正的Array对象。
var arr01 = Array.prototype.slice.call(fakeArray01);
alert(arr01[0]);//a
var arr02 =  [].slice.call(fakeArray01);
alert(arr02[0]);//a
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3558次
    • 积分:248
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类