变量会被覆盖

时间:2013-05-12 23:42:24

标签: javascript

我对Javascript和Java中的变量声明有疑问。

让我们说在Java中我在我的代码中声明一个变量int x = 6;作为全局变量然后沿着我改变x = 10的方式。 x变量是永久地将其6乘以10吗? 在Javascript中,我们说var area = 6然后我将area = 12作为全局变量而不是本地变量在函数内部进行更改。是否会被永久覆盖?

4 个答案:

答案 0 :(得分:1)

int是Java和Javascript中的“原语”,并且作为它们的值存储在命名它们的变量中。更改变量的int时,将直接更改该变量内部的值。旧值不再存在。 (我们称这种行为为值型)

但是,对象是不同的,因为变量只是REFERENCE对象 - 并且取决于对象是否可变(例如Java数组)或不可变(例如Java字符串),对象上的操作将改变该对象,使得每个变量引用它会看到更改,或者使用更改创建一个新对象,这样只有引用新对象的变量才能看到更改,旧对象永远是不可变的。

答案 1 :(得分:0)

是的,他们打算这样做。维持国家。现在,如果您不想更改变量的状态,您可以在Java的上下文中声明它们final

答案 2 :(得分:0)

在您的示例中,简单的答案是“是”!使用int,该值将被替换。如果您正在使用字符串,则这些字符串是不可变的,这意味着如果您有:

str =“hello”;

然后你有:

str =“hello world”;

创建字符串的新实例,而不是替换字符串值。实际上你可能没有看到差异。

答案 3 :(得分:0)

我的经验主要是使用Java,所以这里有。

在java中,您有原始数据类型和对象。他们俩发生的事情是不同的。 int是一种原始数据类型,包括byteshortlongfloatdoubleboolean和{{ 1}}。原始类型存储在堆栈中,而对象存储在堆中。这意味着原始类型按原样存储,而对象从堆栈指向。

这让我想到了答案。当您将charx重新分配到6时,它会永久更改x。 10被覆盖。这只发生在原始类型中。更改的对象不会被覆盖,旧的对象会被用于垃圾收集,可以找到更多信息here,因为这超出了问题的范围。所以你的Java问题的答案是肯定的。

对于javascript,当你创建一个全局变量时,它超出了垃圾收集的范围。据我所知,javascript中的所有内容都是一个对象,甚至是原始类型6。每次更换数字时,实际上都会在其他地方创建一个新数字。由于您正在创建全局变量,因此您不在垃圾收集集中,因此可能正在创建memory leak until you refresh the page or navigate away from it。但是,不同的引擎可能会有不同的行为,因此您需要注意这一点。