Home  >  Q&A  >  body text

javascript - 一个javascipt中for循环的问题

我在《js设计模式和开发实践》书中闭包一章看到如下写法

for(var i=0,type;type=['String','Array','Number'][i++]){
    (function(type){
        Type['is'+type]=function(obj){
            return Object.prototype.toString.call(obj)==='[object'+type+']'
        }
    })(type)        
};

请问这个for循环中的var i=0,type;type='String','Array','Number'是什么意思,我看不太懂

大家讲道理大家讲道理2771 days ago406

reply all(4)I'll reply

  • ringa_lee

    ringa_lee2017-04-11 12:15:53

    for语句括号里不是可以有三种表达式么, 初始化表达式, 控制表达式和循环后表达式, 其中初始化表达式是初始化for循环的时候执行的, 也就是这里的var i=0,type;, 你可以简单的把它看成一个语句, 而控制表达式则是这里的type=['String','Array','Number'][i++], 这里做的就是访问['String','Array','Number']这个数组的第i项并且给i做自增,那么当i > 3之后, 由于 ['String','Array','Number'][i++]undefined, 所以它就不满足继续循环的条件, 然后就会退出了。

    不过说实话, 我个人是不喜欢这种风格的for循环的写法的, 就为了所谓的节省语句或者奇淫技巧? 还是说只是习惯而已? 写出这样的代码反而使得代码更难阅读。而且这里循环每执行一次就会重新生成一个数组字面量并去访问里面的值, 很明显这个数组是可以提到外面去从而避免每次都重新生成的。

    var types = ['String','Array','Number'], len = types.length;
    for(var i=0; i < len; i++){
        // var type = types[i];
        (function(type){
            Type['is'+type]=function(obj){
                return Object.prototype.toString.call(obj)==='[object'+type+']'
            }
        })(types[i])        
    };

    reply
    0
  • 黄舟

    黄舟2017-04-11 12:15:53

    ['String','Array','Number']不就是数组嘛…后面的[i++]是数组的 index 啊

    reply
    0
  • 黄舟

    黄舟2017-04-11 12:15:53

    你可以拆解一下,把

    ['String','Array','Number']

    看作一个变量:

    $typeArr = ['String','Array','Number'];

    当i从0开始自增时,则$type的值依次为:

    $type = $typeArr[0];// 即$type = "string";
    $type = $typeArr[1];// 即$type = "Array";
    $type = $typeArr[2];// 即$type = "Number";

    reply
    0
  • 阿神

    阿神2017-04-11 12:15:53

    也可以写为

            var type=['String','Array','Number'];
            for(var i=0;type[i];i++){
                (function(type){
                    Type['is'+type]=function(obj){
                        return Object.prototype.toString.call(obj)==='[object'+type+']'
                    }
                })(type)        
                
    
            }    

    reply
    0
  • Cancelreply