达夫设备循环问题

今天在看《高性能javascript》这本书,看到达夫设备优化的代码:
do{}while(--n);这里前减,假设是12长度的循环,iterations取整是1,那怎么也不会有第二次8次的循环吧?

//长度
        var a=[1,2,3,4,5,6,7,8,9,10,11,12];
        var iterations=Math.floor(a.length/8);
        console.log("iterations:"+iterations);
        var startAt=a.length%8;
        console.log("取余:"+startAt);
        var count=0;
        do{
            switch(startAt){
                case 0: console.log(count++);
                case 7: console.log(count++);
                case 6: console.log(count++);
                case 5: console.log(count++);
                case 4: console.log(count++);
                case 3: console.log(count++);
                case 2: console.log(count++);
                case 1: console.log(count++);
            }
            startAt=0;
        }while(--iterations);//这里前减,不是就=0了,没有进入下一次循环,最终就4次循环。

结果:
clipboard.png

而我改成while(iterations--),就可以循环全部了,到底咋回事,难道书上印错了,还是我眼睛花了,就大神指点。

clipboard.png

阅读 4.2k
3 个回答

--iterations时

startAt = 4,执行
    case 4: console.log(count++);//0
    case 3: console.log(count++);//1
    case 2: console.log(count++);//2
    case 1: console.log(count++);//3
--iterations = 0---->false停止。

iterations--时

startAt = 4,跳至case 4 执行
    case 4: console.log(count++)//0;
    case 3: console.log(count++)//1;
    case 2: console.log(count++)//2;
    case 1: console.log(count++)//3;
--iterations = 1---->true再来一遍。
startAt=0,跳至case 0,执行
    case 0: console.log(count++);//4
    case 7: console.log(count++);//5
    case 6: console.log(count++);//6
    case 5: console.log(count++);//7
    case 4: console.log(count++);//8
    case 3: console.log(count++);//9
    case 2: console.log(count++);//10
    case 1: console.log(count++);//11
--iterations = 0--->false停止
不加break还会执行后面的case语句。

可能你是switch case不加break怎么运行没搞清楚吧。

那里的两段代码都有问题,你说的这一段改成while(iterations--)当数组长度是8的倍数时同样有问题

是书上印错了,可以改成while(iterations--),或者改成while(--iterations > 0)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题