我对 Javascript 和 Java 中的变量声明有疑问。
假设在 Java 中,我在代码中声明了一个变量int x = 6;
作为全局变量,然后在此过程中进行了更改x = 10
。变量是否x
将其 6 永久替换为 10?在 Javascript 中,假设我在函数内部作为全局变量而不是局部变量进行var area = 6
更改。area = 12
它会被永久覆盖吗?
我对 Javascript 和 Java 中的变量声明有疑问。
假设在 Java 中,我在代码中声明了一个变量int x = 6;
作为全局变量,然后在此过程中进行了更改x = 10
。变量是否x
将其 6 永久替换为 10?在 Javascript 中,假设我在函数内部作为全局变量而不是局部变量进行var area = 6
更改。area = 12
它会被永久覆盖吗?
int 是 Java 和 Javascript 中的“原语”,并作为它们的值存储在命名它们的变量中。当您更改变量的 int 时,该变量内部的值会直接更改。旧值不再存在。(我们将这种行为称为 value-type )
然而,对象是不同的,因为变量只有 REFERENCE 对象——并且取决于对象是可变的(例如 Java 数组)还是不可变的(例如 Java 字符串),对对象的操作将改变该对象,以便引用它的每个变量都看到更改,或使用更改创建新对象,这样只有引用新对象的变量才能看到更改,旧对象永远不可变。
我的经验主要是 Java,所以就到这里。
在 Java 中,您有原始数据类型和对象。他们两个发生的事情是不同的。是一种原始数据类型,int
包括byte
、short
、long
、float
、double
和。原始类型存储在堆栈中,而对象存储在堆中。这意味着原始类型按原样存储,而对象则从堆栈中指向。boolean
char
这让我想到了答案。当您x
从重新分配6
到 时10
,它会永久更改 x。被6
覆盖。这只发生在原始类型上。被更改的对象不会被覆盖,旧的对象会被用于垃圾收集,更多信息可以在这里找到,因为这超出了问题的范围。因此,您对 Java 的问题的答案是肯定的。
至于javascript,当你创建一个全局变量时,它是在垃圾收集的范围之外的。据我了解,javascript 中的一切都是对象,甚至是原始类型number
。每次更换号码时,它实际上都会在其他地方创建一个新号码。由于您正在创建一个全局变量,因此您处于垃圾收集之外,随后可能会造成内存泄漏,直到您刷新页面或离开它为止。但是,不同的引擎可能有不同的行为,因此您需要注意这一点。
是的,他们就是要这样做。维持状态。现在,如果您不想更改变量的状态,您可以final
在 Java 的上下文中很好地声明它们。
在您的示例中,简单的答案是“是”!使用 int,该值将被替换。如果您使用的是字符串,则它们是不可变的,这意味着如果您有:
str = "你好";
然后你有:
str = "你好世界";
创建一个字符串的新实例,而不是替换字符串值。实际上,您可能看不出有什么不同。