javascript throws Uncaught TypeError:填充多维数组时无法设置undefined属性'0'

时间:2015-11-11 16:27:45

标签: javascript multidimensional-array

我正在调试一个5年多的旧剧本,这让我疯狂。我找到的答案都没有帮我查明错误。 阅读完阵列后,我已经制作了一个新版本。 无论是位置还是异常的“时间”对我来说都没有任何意义......

//NEW VERSION
tasks=[];
status=[];

function initCalendarInfo(){
    for (k=0;k<40;k++) {
        tasks[k] = [];
        status[k] = [];
        for (i=0;i<12;i++) {
            tasks[k][i]= [];
            //THROWS EXCEPTION IN NEXT LINE k=0,i=0,j=0
            status[k][i]= [];
            for (j=0;j<31;j++){
                tasks[k][i][j]='';
                status[k][i][j]=0;
            }
        }
    }
}

//OLD VERSION
tasks = new Array(40);
status= new Array(40);

function initCalendarInfo(){
    for (k=0;k<40;k++) {
        tasks[k] = new Array(12);
        status[k] = new Array(12);
        for (i=0;i<12;i++) {
            tasks[k][i]= new Array(31);
            status[k][i]= new Array(31);
            for (j=0;j<31;j++){
                tasks[k][i][j]='';
                //THROWS EXCEPTION IN NEXT LINE k=0,i=1,j=0 
                status[k][i][j]=0;
            }
        }
    }
}   

2 个答案:

答案 0 :(得分:3)

这是避免全局变量的众多原因之一。

在浏览器上,已经有一个名为status的全局变量,您无法更改其类型。它是一个字符串,并为其分配一个数组只会导致数组被强制转换为字符串(空白数组强制转换为空字符串)。回到当天,status用于在浏览器的状态栏中设置文字。浏览器主要是A)不再具有永久状态栏(只是显示为叠加的状态栏),B)不允许你改变它们(因为人们过去常常显示链接的虚假版本)当真正的联系......好吧......其他事情)。

如果将整个脚本放在作用域函数中并声明变量,问题就会消失:

&#13;
&#13;
(function () {
    //NEW VERSION
    var tasks = [];
    var status = [];

    function initCalendarInfo() {
        for (var k = 0; k < 40; k++) {
            tasks[k] = [];
            status[k] = [];
            for (var i = 0; i < 12; i++) {
                tasks[k][i] = [];
                //THROWS EXCEPTION IN NEXT LINE k=0,i=0,j=0
                status[k][i] = [];
                for (var j = 0; j < 31; j++) {
                    tasks[k][i][j] = '';
                    status[k][i][j] = 0;
                }
            }
        }
    }

    initCalendarInfo();
    snippet.log(JSON.stringify(status, null, 2));
    snippet.log(JSON.stringify(tasks, null, 2));
})();
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

关于声明变量:您的代码即使您将其置于作用域函数中,也会成为The Horror of Implicit Globals的牺牲品。声明变量非常重要。

答案 1 :(得分:0)

没关系好人。 &#34;状态&#34;似乎是一个保留字或引用状态栏或其他东西。刚重命名变量和瞧。无论如何,这种行为很奇怪 - 特别是对于预定义的阵列,所以任何光线都会被欣赏!