Javascript 未捕获的类型错误:无法设置未定义的属性“0”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10673237/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 02:27:04  来源:igfitidea点击:

Uncaught TypeError: Cannot set property '0' of undefined "

javascript

提问by user1406186

i'm getting the error

我收到错误

Uncaught TypeError: Cannot set property '0' of undefined

未捕获的类型错误:无法设置未定义的属性“0”

for some reason in this line

出于某种原因在这一行

world_map_array[i][z]="grass.gif|ongrass.gif|collision.gif|above.gif";

Why is this happening?

为什么会这样?

thanks for any help

谢谢你的帮助

var x_world_map_tiles = 100; 
var y_world_map_tiles = 100; 

var world_map_array = new Array(x_world_map_tiles);
for (i=0; i<=2; i++)//create a two dimensional array so can access the map through x and y coords map_array[0][1] etc.
{
world_map_array[i]=new Array(y_world_map_tiles);
}


for (i=0; i<=x_world_map_tiles; i++)//just a test
{
for (z=0; z<=y_world_map_tiles; z++)//just a test
{
world_map_array[i][z]="grass.gif|ongrass.gif|collision.gif|above.gif";
}
}

回答by Matt McMahon

Arrays in JavaScript have quirks of their own that you may not be expecting if you come from other languages. Two important ones for your use case are:

JavaScript 中的数组有自己的怪癖,如果您来自其他语言,您可能不会想到这些怪癖。对于您的用例来说,两个重要的是:

  1. You cannot directly declare multidimension arrays in JavaScript.
  2. There's little efficiency benefit (and no added safety) when you set the size of the array at creation.
  1. 不能在 JavaScript 中直接声明多维数组。
  2. 当您在创建时设置数组的大小时,几乎没有效率优势(并且没有增加安全性)。

Unlike other languages, JavaScript won't allocate a block of memory for the full array. (It doesn't know what kind of objects you're going to be putting in each cell, and therefore how much total memory it will need.) Instead, all the sizeargument to Array()does for you is set the array's lengthproperty.

与其他语言不同,JavaScript 不会为整个数组分配一块内存。(它不知道您将在每个单元格中放入什么样的对象,因此不知道它需要多少总内存。)相反,sizetoArray()为您所做的所有参数都是设置数组的length属性。

For the general, 2d array case, I'd suggest:

对于一般的二维数组情况,我建议:

  1. Create the "top" array, e.g.:

    var i       // the first-order index in a
      , j       // the second order index in a
      , a = []
    
  2. Initialize array elements as needed. This is called lazy initialization, and, in this case, it simply involves testing that a[i]exists before we try to assign something to a[i][j], e.g.:

    if (!a[i]) a[i] = []
    

    In English the above statement reads: "If the i-th element of ais 'falsy', assign an empty array to the i-th element."

  3. Finally, assign the actual value to the multideminsional array:

    a[i][j] = 'whatever'
    
  1. 创建“顶部”数组,例如:

    var i       // the first-order index in a
      , j       // the second order index in a
      , a = []
    
  2. 根据需要初始化数组元素。这称为延迟初始化,在这种情况下,它只涉及a[i]在我们尝试将某些内容分配给 之前存在的测试a[i][j],例如:

    if (!a[i]) a[i] = []
    

    在英语中,上面的语句是:“如果的第 i 个元素a是 'falsy',则为第 i 个元素分配一个空数组。”

  3. 最后,将实际值分配给多维数组:

    a[i][j] = 'whatever'
    

For your case, you know the values ahead of time, so you can initialize each element in advance. (If you're not overriding most of the elements, however, a lazy implementation may be better; see below.)

对于您的情况,您提前知道这些值,因此您可以提前初始化每个元素。(但是,如果您没有覆盖大部分元素,那么惰性实现可能会更好;请参见下文。)

var x, x_length = 100
  , y, y_length = 100
  , map = []

// Don't be lazy
for (x = 0; x < x_length; x++) {
  map[x] = []
  for (y = 0; y < y_length; y++) {
    map[x][y] = 'grass.gif|ongrass.gif|collision.gif|above.gif'
  }
}

As some others have said, an array with 100 elements has indexes numbered from zeroto ninety-nine, so a less-than comparison is most appropriate here.

正如其他一些人所说,一个包含 100 个元素的数组的索引编号从099,因此小于比较在这里最合适。



For reference, here's an implementation that uses lazy initialization. I've gone with a function interface instead of directly accessing the array; it's longer and more complex, but also more complete.

作为参考,这里有一个使用延迟初始化的实现。我使用了函数接口,而不是直接访问数组;它更长、更复杂,但也更完整。

The initialization pattern I've used here is called an immediately invoked function expression. If you haven't seen it before, it's one of the more useful JavaScript patterns and well worth taking some time to understand.

我在这里使用的初始化模式称为 立即调用函数表达式。如果您以前没有见过它,它是更有用的 JavaScript 模式之一,非常值得花一些时间来理解。

var map = (function (x_length, y_length, v_default, undefined) {
  // Unless v_default is overwritten, use ...
  v_default = v_default || 'grass.gif|ongrass.gif|collision.gif|above.gif'

  // Private backing array; will contain only values for a[x][y] 
  // that were explicitly set.
  var a = []

  // Private helper function. 
  // - Returns `true` if `x` is between `0` and `x_length - 1`
  //   and `y` is between `0` and `y_length - 1`.
  // - Returns `false` otherwise.
  function valid (x, y) {
    return (x >= 0 
      &&    x <  x_length
      &&    y >= 0
      &&    y <  y_length)
  }

  // Private helper function.
  // - Returns `true` if a[x][y] has been set().
  // - Returns `false` otherwise.
  function exists (x, y) {
    return !!a[x] && !!a[x][y]
  }

  // Private getter
  // - Returns the value of a[x][y] if it has been set().
  // - Returns `undefined` if the point (x,y) is invalid.
  // - Returns `v_default` otherwise.
  function get (x, y) {
    if (!valid(x, y))      return undefined
    else if (exists(x, y)) return a[x][y]
    else                   return v_default
  }

  // Private setter
  // - Returns the value set on success.
  // - Returns `undefined` on failure
  function set (x, y, v) {
    if (valid(x, y)) {
      // We're being lazy
      if (!a[x]) a[x] = []
      a[x][y] = v
      return a[x][y]
    }
    return undefined
  }

  // Return an interface function. 
  // - Pass the function three arguments, (x, y, v), to set a[x][y] = v
  // - Pass the function two arguments, (x, y), to get a[x][y]
  return function (x, y, v) {
    if (arguments.length > 2) {
       return set(x, y, v)
    } else {
       return get(x, y)
    }
  }
})(100, 100)

When I ran the above in node, the following tests printed sensible values:

当我在 node 中运行上述内容时,以下测试打印了合理的值:

// Invalid invocations
console.log('map()                : %s', map())
console.log('map(  0)             : %s', map(0))
console.log('map( -1,   0)        : %s', map(-1,0))
console.log('map(  0,  -1)        : %s', map(0, -1))
console.log('map( -1,  -1)        : %s', map(-1, -1))

// Valid invocations
console.log('map(  0,   0)        : %s', map(0, 0))
console.log('map( 99,  99)        : %s', map(99, 99))
console.log('map(  1,   1)        : %s', map(1,1))
console.log('map(  1,   1, "foo") : %s', map(1,1, 'foo'))
console.log('map(  1,   1)        : %s', map(1,1))

回答by Engineer

This

这个

for (i=0; i<=2; i++)

must be:

必须是:

for (i=0; i<=x_world_map_tiles ; i++)

回答by Danilo Valente

var x_world_map_tiles = 100;
var y_world_map_tiles = 100;
var world_map_array = new Array(x_world_map_tiles);
for (i=0; i<=2; i++)//create a two dimensional array 
{
    world_map_array[i]=new Array(y_world_map_tiles);
}
for (i=0; i<x_world_map_tiles; i++)
{
    for (z=0; z<y_world_map_tiles; z++)
    {
        world_map_array[i][z]="grass.gif|ongrass.gif|collision.gif|above.gif";
    }
}

As your array has a length of 100, you must go from 0to 99(<100) and not to 100(<=)

当你的阵列具有100的长度,则必须从去099(<100),而不是100(<=)

回答by Koen Peters

You're feeding the world_map_array[i]expression a value for ithat does not exist in world_map_array. So I guess x_world_map_titlesis > 2.

您正在为world_map_array[i]表达式提供一个值,i该值在 world_map_array. 所以我猜x_world_map_titles是> 2。

I think you need to rewrite i<=2to i<=x_world_map_titles

我认为你需要重写i<=2i<=x_world_map_titles

Also you do not need to specify the size of the array. I would just use literals in this case:

您也不需要指定数组的大小。在这种情况下,我只会使用文字:

var x_world_map_tiles = 100;  
var y_world_map_tiles = 100; 

var world_map_array = [];
for (i=0; i<=x_world_map_tiles; i++)
  //create a two dimensional array of 101x101 so can access the map through x and y coords map_array[0][1] etc. { 
  world_map_array[i]=[];
}

for (i=0; i<=x_world_map_tiles; i++)//just a test { 
  for (z=0; z<=y_world_map_tiles; z++)//just a test { 
    world_map_array[i][z]="grass.gif|ongrass.gif|collision.gif|above.gif"; 
  }
}

回答by user9205263

Getting Uncaught TypeError while using 2-D array in javascript.

在 javascript 中使用二维数组时获取未捕获的 TypeError。

For two- dimension array, first declare parent array

对于二维数组,首先声明父数组

var arryTwoDimension= [];

var arryTwoDimension= [];

Then depending on the situation, we can create child array by

然后根据情况,我们可以通过创建子数组

arryTwoDimension[i]=[] i will be from 0,1,2......

arryTwoDimension[i]=[] i 将来自 0,1,2......

This will solve the issue.

这将解决问题。