数组不兼容Javascript

时间:2015-06-13 21:43:50

标签: javascript

当我构造正方形数组然后将其传递给新的Float32Array时,我得到一个错误,但是,当我将temp传递给Float32Array(并手动将numTriangles指定为6)时,一切正常... asdf两次尝试都记录到控制台,不知道为什么会这样。

  var square = [[-1,-1,],[1,-1],[-1,1],[-1,1],[1,-1],[1,1]];
  var numTriangles = square.length;
  square = square.join();
  var temp = [-1,-1,1,-1,-1,1,-1,1,1,-1,1,1];
  if (square == temp) {
    console.log("asdf");
  }
  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(square),gl.STATIC_DRAW);
  gl.enableVertexAttribArray(positionLocation);
  gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);

  gl.drawArrays(gl.TRIANGLES, 0, numTriangles); //numTriangles == 6

2 个答案:

答案 0 :(得分:1)

方法join() produces a string,而不是数组。 Float32Array不能将字符串或二维数组作为参数。

一种有点hackish的解决方法是在join()之后解析字符串为JSON:

var square = [[-1,-1],[1,-1],[-1,1],[-1,1],[1,-1],[1,1]],
    float;

float = new Float32Array(JSON.parse("[" + square.join() + "]"));
console.log(float);

然而,这会对性能产生影响。更好的方法是在更新类型化数组时循环遍历数组并展平它:

var square = [[-1,-1],[1,-1],[-1,1],[-1,1],[1,-1],[1,1]],
    len = square.length,
    float = new Float32Array(len * 2),
    i = 0, t = 0;

while(i < len) {
  float[t++] = square[i][0];
  float[t++] = square[i++][1];
}

console.log(float);

后者有更多代码,但比第一种方法many times faster

PS:阵列中还有一个额外的逗号,不应该存在。

答案 1 :(得分:0)

squaretemp指向的数组是对相应数组的引用。所以这些引用总是不同的,因为第一个是.join()方法的结果,第二个是对静态内联数组的引用。

您需要在一个循环中比较两个数组的每个元素。