0
 var name = 'naGeoExit';

 var name = name.substring(2,5);      
 console.log(name); //output: Geo

第一个名称变量和第二个名称变量是在内存的不同部分分配的两个不同的变量,还是原始变量的值正在改变?

4

3 回答 3

4

如果它们具有相同的名称并且在相同的范围内,则它们是相同的变量。

于 2013-06-17T10:29:41.150 回答
3

在第 1 行,内存中有一个包含“naGeoExit”的字符串。范围中有一个变量,称为name指向它的变量。

在第二行,内存中存在字符串子序列的副本。变量name现在指向这一点。没有对原始字符串对象的引用,因此它在某些时候被垃圾收集。

使用var关键字的意思是“在当前范围内(而不是全局范围内)创建一个变量”。当前范围是一个闭包,例如一个函数定义(尽管如果您不在函数中,它也可以是全局范围)。

使用两次不是语法错误var,但其目的是创建一个新变量,并且每个范围只能使用一次。第二轮将没有效果。

于 2013-06-17T10:32:14.933 回答
1

是的,原始字符串未修改。但是,在您的示例中,它可以立即用于垃圾收集。

这是一个更清楚地显示字符串未修改的示例:

var n1 = 'naGeoExit';

var n2 = n1.substring(2,5);      
console.log(n1); //output: naGeoExit
console.log(n2); //output: Geo

在您的原始代码中,您只有一个名为 的变量name,并且您将substring操作的结果分配给它,这就是为什么原始字符串可以立即用于垃圾回收的原因。在同一个作用域内重新声明同一个变量是没有效果的。所以代码:

var name = "foo";
var name = "bar";

...与以下内容完全相同:

var name = "foo";
name = "bar";

...并且就此而言,与以下内容完全相同:

var name;
name = "foo";
name = "bar";
于 2013-06-17T10:33:05.357 回答