码迷,mamicode.com
首页 > 编程语言 > 详细

js数组的内部实现,迭代器,生成器和内包

时间:2015-02-11 23:10:33      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:

js内部实现

在js以外的很多语言中,数组将会隐式占用一段连续的内存空间。
这种隐式的内部实现,使得高效的内存使用及高速的元素方法称为可能,而

在javascript中,数组实体是一个对象,所以通常的实现方式
并不是占用一段连续的内存空间
比较下面2段代码

<script>
//代码1
var arr=[];
 for(var i=0;i<1e7;i++){
     arr[i]=‘‘;
 }
//代码2
 var arr={};
 for(var i=0;i<1e7;i++){
     arr[i]=‘‘;
 }
</script>

根据实现方式的不同,代码1和代码2的执行速度会有所差异,这其实是数组是否使用连续的内存空间的一种体现。
然而如果数组内部总是使用连续的内存空间,下面代码就应该占用多达GB量级的连续内存,不过在一般的实现中,这样的情况不糊发生

<script>
var arr=[];
arr[1e9]=‘‘;
</script>

在流行的jsvascript实现中,小型的数组(下标值较小的部分)会占用连续的内存空间,而下标值较大的部分,

则一般会以类似于对象的形式进行处理
此外在js中 也有人提出需要增加Int32Array或Int8Array这类自定义增强功能

数组风格的对象调用Array类的方法

 

<script>
var fake_arr={0:zero,1:one,2:two,length:3}
fake_arr.join(,);//Uncaught TypeError: undefined is not a function
p(Array.join(fake_arr,,));//zero,one,two     firefox可以运行  其它浏览器可能报错
Array.push(fake_arr,three);
p(fake_arr.length);//4
p(Array.join(fake_arr,_));//zero_one_two_three
//另外一种
p(Array.prototype.join.call(fake_arr,-));  // zero-one-two-three 更多浏览器支持了
</script>

 

迭代器
一种专门为循环操作设计的对象
在javascript中有Iterator类这样一个自定义增强功能。
可以通过构造函数调用或Iterator函数的调用来生成一个对象实例,这时需要将想要枚举的目标对象传递个它的第一个参数
在迭代器对象中含有一个next方法,可以从对象或元素的集合中返回下一个所需的元素
下面代码在firefox下正常运行,在其他浏览器中可能出问题

<script>
var arr=[zero,one,two];
var it=new Iterator(arr,true);
p(it.next());//0  单个元素
p(it.next());//1
p(it.next());//2
p(it.next());//uncaught exception: [object StopIteration]
//如果第二个参数为false
var it=new Iterator(arr,false);
p(it.next());//[0 ,zero ]  数组
p(it.next());//1 one
p(it.next());//2 two
p(it.next());//uncaught exception: [object StopIteration]
</script>

对Iterator使用for in

<script>
var arr=[zero,one,two];
var it=new Iterator(arr,false);
for(var item in it){
    for(var k in item){
        p(k+":"+item[k]);
    }
    p("--------------------------------------")
}
/*输出
0:0
1:zero
--------------------------------------
0:1
1:one
--------------------------------------
0:2
1:two
--------------------------------------
*/
</script>

对于已经存在的对象或数组来说,使用Iterator没有太大作用
for in等语句已经足够
使用场景:自定义迭代器
代码如下

<script>
//迭代器的目标对象
function Factorial(max){
    this.max=max;
}
//自定义迭代器
function FactorialIterator(factorial){
    this.max=factorial.max;
    this.count=this.current1=1;
}
//迭代器的实现
FactorialIterator.prototype.next=function(){
    if(this.count>this.max){
        throw StopIteration;
    }else{
        return this.current1*=this.count++;
    }
}
//将Factorial与FactorialIterator相关联
//_iterator_属性是一种特殊属性
Factorial.prototype._iterator_=function(){
    return new FactorialIterator(this);
}
var obj=new Factorial(5);
for(var n in obj){
    p(n)
}
</script>

 

js数组的内部实现,迭代器,生成器和内包

标签:

原文地址:http://www.cnblogs.com/HKUI/p/4287025.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!