Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中更改OOP中类的变量_Javascript - Fatal编程技术网

在javascript中更改OOP中类的变量

在javascript中更改OOP中类的变量,javascript,Javascript,我定义了一个名为Node的函数,它将节点的属性存储在图形数据结构中。函数如下所示: function Node(){ ... this.outEdges = []; this.inEdges = []; ... } 其中inEdges和OUTEDGE存储Edge类型的元素,Edge是我定义的另一个函数。在编程过程中,这些数组充满了元素 在我的代码中的某个时刻,我需要重置这两个数组,以便编写: nodes[i].outEdges.length = 0;

我定义了一个名为Node的函数,它将节点的属性存储在图形数据结构中。函数如下所示:

function Node(){
    ...
    this.outEdges = [];
    this.inEdges = [];
    ...
}
其中inEdges和OUTEDGE存储Edge类型的元素,Edge是我定义的另一个函数。在编程过程中,这些数组充满了元素

在我的代码中的某个时刻,我需要重置这两个数组,以便编写:

    nodes[i].outEdges.length = 0;
    nodes[i].inEdges.length = 0;
其中nodes是Node类型的元素数组,我正在访问for循环中的元素


问题是,将outEdges和inedge设置为0后,我希望它们在nodes[I]属性列表中为[]。但是,当我将节点[I]输出到控制台中时,outEdges和inedge中仍然包含元素。奇怪的是,当我输出节点[I].路由到控制台时,它会打印[],这是正确的,但再次单击[]会打开元素列表!我真的不明白为什么节点[I]变量没有改变?

你不应该设置长度字段。只需重新初始化它们:

nodes[i].outEdges = [];
nodes[i].inEdges = [];

编辑:My bad,设置长度应该可以。它至少在Chrome上对我有用。但是,我仍然认为重新初始化更安全、更好。

只需创建一个同名的新对象

nodes[i].outEdges = new Array();
发生这种情况(可能)是因为浏览器打印出空数组,但当您检查它时,它又有了内容。因此,当您单击展开时,浏览器将显示实际内容


正如您所见,值[1,3,7]是在命令
console.log(o)
之后添加的,但它们会显示在屏幕上(即使显示的长度是
0
)。

将数组长度设置为0会重新初始化数组。“您可以设置长度属性以随时截断数组。”参考:@Felix Kling截断比定义空白数组快多少?你有证据支持吗?即使是a也显示了创建一个空白数组来faster@Andrei例如我没说快一点。我说的内存效率更高,因为您没有创建新的阵列实例,也没有等待垃圾收集器收集旧的。@Andrei:您可以使用Chrome的开发工具创建堆快照,并查看时间线工具,垃圾收集器使用和释放了多少内存。但是,你创建的对象越少,你使用的内存就越少,这不是很明显吗?你在哪个浏览器中遇到过这种情况?你能添加更多的代码吗?最有可能的情况是,您正在访问节点并重新初始化,这就是问题所在。您可以运行控制台检查<代码>var arr=[1,2,3];arr.length=0;arr//outputs[]就其本身而言,您在文章中描述的过程应该可以工作。问题可能出在代码的其他地方。@Felix我随机猜测是IE:)这实际上是firefox!这是一种在javascript中创建数组的糟糕方法。为什么?我对对象也做了同样的事情(var obj=new Object())我从MDN学习了JS,而不是一本教科书,所以我在wiki上看到它后认为它很好:@Chris.Stover好吧,当你使用
new array()创建数组时
它告诉解释器在执行上下文中查找
数组
构造函数,并调用它来生成一个新对象,这会给过程增加一点开销。另一方面,
[]
会立即创建一个新的运行时数组。@Chris.Stover它在技术上比较慢,并且可以覆盖
数组
构造函数。我没有投反对票,但它更倾向于使用
[]
。将一个参数指定给
Array
时也会让人感到困惑。如果它是一个数字,生成的数组将是一个与参数大小相同的数组。例如,
newarray(50)
将是一个包含50个
未定义项的数组
[50]
创建一个包含
50
的数组<当
[]
一致时,code>Array
可能会引起混淆。@Chris.Stover他们似乎不提倡使用构造函数。他们似乎实际上是在鼓吹
[…]
。构造函数的唯一优点是
…=数组(int)
signature(它提示应该为数组预分配多少)。请注意,以
new
开头的任何内容实际上都是一个对象,而不是一个基本值。这会影响
typeof
和虚假性检查(所有对象都是真实的)。