2014-02-20 14 views
4

如果我运行以下JavaScript代码,浏览器会警告“undefinedabc”。为什么JavaScript中的变量似乎保留值“undefined”,即使它被定义为

var x; 
x += "abc"; 
alert(x); 

对我来说,看起来好像我确实定义了变量x,为什么它看起来没有定义?

+2

不要混淆声明和定义 – Eric

+0

只要你不给它赋值,它的值就是“undefined”。如果你在字符串中使用'+ =',它将总是使用'old'字符串值并将新的字符串附加到它。不过,“旧”字符串值是“未定义的”。 – devnull69

+0

谢谢Eric,我确实犯了这个错误。 – Tom

回答

5

undefined是没有赋值的任何变量的默认值。因此,var x;表示a = undefined。当你添加​​时,你实际上在做undefined + "abc"。最后,undefined被字符串分割为"undefined",然后连接到​​并转向"undefinedabc"

为了Concat的初始化VAR x,你应该分配一个空字符串给它(记住,JavaScript的dinamically类型的):

var x = ''; 
x += "abc"; 
alert(x); // "abc" 

This MDN article描述了这种行为。

+0

我会接受这个答案,因为你指出我undefined是一个变量的默认值。 – Tom

+0

很高兴帮助。谢谢 :) –

5
var x = ""; 
x += "abc"; 
alert(x); 

试试这个。您正尝试添加'abc'undefined,这将导致undefinedabc

1

首先检查一个Variable Statement的行为,具体做法是:

"Variables are initialised to undefined when created." 

然后检查addition operator的行为(compound assignment施加对应于什么先=操作者的行为)。

具体而言,点7:

"If Type(lprim) is String or Type(rprim) is String, then 
Return the String that is the result of concatenating ToString(lprim) followed by ToString(rprim)" 

因此,既然​​是一个字符串,x将被翻译为一个字符串,根据的ToString。正如我们从上面所知,x是未定义的。

最后,检查抽象操作ToString的行为,特别是未定义的参数导致字符串“undefined”。

相关问题