理解有点奇怪的javascript数组表示法

时间:2014-05-30 21:46:48

标签: javascript arrays

在脚本中我看到了这个:

function addToPoint(x, y) {
    x = Math.floor(x/SCALE);
    y = Math.floor(y/SCALE);
    if (!points[[x,y]]) {
      points[[x,y]] = 1;
    } else if (points[[x,y]]==10) {
      return;
    } else {
      points[[x,y]]++;
    }
  drawPoint(x*SCALE,y*SCALE, points[[x,y]]);

}

我认为发生的事情是这样的:

points[[x,y]] = 1;

这里,伙伴动态地为points-object(被声明为空)创建一个字段。通过像这样传递它,它被转换为一个字符串,函数的x和y参数将组成该字段。

所以,实际上,如果我调用addToPoints(3,4),代码会产生这样的结果:

points["3,4"] = 1;

这对我来说真的很奇怪:[x,y]是一个合法的数组吗?这是什么样的符号?这背后的规则是什么?

我稍微使用了代码,看起来你可以通过这样做来在JavaScript中声明一个数组:

[x,y]; 

帮助,提示和澄清表示赞赏!

2 个答案:

答案 0 :(得分:3)

var arr = [ x, y ];只是declare an array in JavaScriptxy作为第一和第二元素的方式。

第二部分points[[x,y]]更令人困惑。基本上会发生的事情是arr数组被转换为字符串(类似于[ 1, 2, 3 ]将成为"1, 2, 3"),然后将其用作points对象上的属性名称

稍微简洁一点(使用实际数字而不是xy参数)会发生什么看起来像这样:

var points = {};

var arr = [ 1, 3 ];
var key = arr.toString(); // '1, 3'

points[key] = 1; // { "1, 3": 1 }

答案 1 :(得分:1)

我相信你在这里想念的是,当你在项目中使用某些东西作为属性名称时,它被转换为字符串:

points[[x,y]] 

真的在做

points[[x,y].toString()]

您可以尝试使用

进行测试
points[{}]

它会创建密钥[object Object]

使用它的原因是javascript中不支持二维数组,但是你可以有数组数组

这个小技巧允许使用一维数组作为二维数据。

这是一个有趣的伎俩:

Array.prototype.toString = function ( ) { return this.join(':') }

现在     点[[x,y]] = 1

将创建键x:y而不是x,y