Javascript Float32数组抛出无法读取属性'0'即使数组定义良好,也为null
Javascript Float32 array throws Cannot read property '0' of null even though array is well defined
在这里您可以看到调试窗口:https://i.stack.imgur.com/Pn0YA.png正如您所看到的,数组不是null,实际上有2个元素。我为什么会犯那个错误?
编辑:这段代码是用C#编写的,并通过DuoCode:转换为JS
WebGL.Vector2 = $d.declare("WebGL.Vector2", null, 62, $asm, function($t, $p) {
$t.cctor = function() {
$t.GLVector2 = vec2;
};
$t.ctor = function Vector2() {
this.vec = null;
};
$t.ctor.prototype = $p;
$p.get_X = function Vector2_get_X() {
return this.vec[0]; //this is line 777
};
$p.set_X = function Vector2_set_X(value) {
this.vec[0] = value;
return value;
};
$p.get_Y = function Vector2_get_Y() {
return this.vec[1];
};
$p.set_Y = function Vector2_set_Y(value) {
this.vec[1] = value;
return value;
};
$p.get_Magnitude = function Vector2_get_Magnitude() {
return Math.sqrt(this.get_X() * this.get_X() + this.get_Y() * this.get_Y());
};
$p.get_Normalized = function Vector2_get_Normalized() {
var m = this.get_Magnitude();
return WebGL.Vector2.op_Division(this, m);
};
$t.ctor$1 = function Vector2() {
this.vec = $d.array(System.Single, 2);
this.set_X(0);
this.set_Y(0);
};
$t.ctor$1.prototype = $p;
$t.ctor$2 = function Vector2(x, y) {
this.vec = $d.array(System.Single, 2);
this.set_X(x);
this.set_Y(y);
};
$t.ctor$2.prototype = $p;
$p.Rotated = function Vector2_Rotated(angle) {
var rad = Math.PI * angle / 180;
var cs = Math.cos(rad);
var sn = Math.sin(rad);
return new WebGL.Vector2.ctor$2(this.get_X() * cs - this.get_Y() * sn, this.get_X() * sn + this.get_Y() * cs);
};
$p.Transformed = function Vector2_Transformed(matrix) {
var ret = new WebGL.Vector2.ctor$1();
$t().GLVector2.transformMat3(ret.vec, this.vec, matrix.mat);
return ret;
};
$t.op_Multiply = function Vector2_op_Multiply(v, f) {
return new WebGL.Vector2.ctor$2(v.get_X() * f, v.get_Y() * f);
};
$t.op_Division = function Vector2_op_Division(v, f) {
return new WebGL.Vector2.ctor$2(v.get_X() / f, v.get_Y() / f);
};
$t.op_Addition = function Vector2_op_Addition(v1, v2) {
return new WebGL.Vector2.ctor$2(v1.get_X() + v2.get_X(), v1.get_Y() + v2.get_Y());
};
$t.op_Subtraction = function Vector2_op_Subtraction(v1, v2) {
return new WebGL.Vector2.ctor$2(v1.get_X() - v2.get_X(), v1.get_Y() - v2.get_Y());
};
$t.Dot = function Vector2_Dot(v1, v2) {
return v1.get_X() * v2.get_X() + v1.get_Y() * v2.get_Y();
};
$p.ToString = function Vector2_ToString() {
return String.Format("[{0}, {1}]", $d.array(System.Object, [this.get_X(), this.get_Y()]));
};
});
你是对的,这是一个糟糕的行为,但它的发生是因为C#中的一个实验特性(无参数构造函数)。通常,C#禁止为结构体声明默认构造函数,这就是为什么必须有一个自动默认构造函数来初始化结构体(并将null设置为引用类型字段,如数组"vec")。
C#增加了主构造函数的选项,但微软已经意识到这太复杂了,我相信他们现在计划放弃这个功能。
DuoCode使用Roslyn进行编译,这就是导致这种行为的原因。Roslyn和DuoCode的下一个版本可能会禁止这样做。
我建议您将Vector2结构设置为具有两个字段(x,y)的不可变结构,这样效果最好。
免责声明:我与DuoCode开发人员合作
编辑:哎呀,它被称为无参数构造函数
好吧,问题如下:出于某种原因,DuoCode为structs生成了一个默认构造函数,该构造函数用null初始化值类型。只有当我显式调用Vector2 v=new Vector2()时,才会调用我的自定义默认构造函数。老实说,这种行为很出乎意料,也很烦人。我希望这将在以后的版本中得到修复。
相关文章:
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 用于检查数组中是否存在元素的javascript自定义方法
- Regex提取URL返回数组的一部分;未定义”;
- Javascript Float32数组抛出无法读取属性'0'即使数组定义良好,也为null
- 角度推入数组给出:TypeError:无法读取属性'推'的未定义
- 处理docXTemplater或javascript对象数组中未定义的值
- Join架构验证:Join.object定义数组中的有效键
- 为什么typeof的数组的数组的未定义值返回为“0”;未定义的“;我的条件不认为是真的
- 如何用Typescript用自定义方法实现类数组
- 使用数组自定义对象
- JavaScript/jQuery JSON数组问题-值为未定义
- 返回由键/值对定义的数组
- 迭代和修改Firebase数组会导致未定义
- 拆分字符串数组(JavaScript)后未定义
- 在使用JavaScript推送数组时定义索引
- javascript函数外未定义的数组
- 用HTML5FileReader填充的Javascript多维数组未定义(但仅在首次使用时!)
- 访问数组定义中的相对索引项
- 为这个JSON输入数组定义ng模型——AngularJS
- 当数组定义为3时,一个Javascript - forth值的神秘工作没有返回异常