所以我正在学习JavaScript并测试下面的代码:
var name;
console.log( name );
返回null
var c;
console.log( c );
返回undefined
为什么会这样?
文档说明:A variable declared using the var statement with no initial value specified has the value undefined.
任何对官方文档的引用都会很棒!
答案 0 :(得分:5)
如果您是在浏览器中执行此操作,那么因为浏览器环境中存在name
(它是窗口的名称) )。所以var name
是无操作的。但是见下文,null
让我感到惊讶。
在JavaScript中,全局变量实际上是全局对象的属性。全局对象是全局范围*中代码中的值this
。在浏览器中,全局对象是该页面的浏览器窗口对象,因此它具有为Window对象定义的任何属性。其中之一是name
。 (另一个是window
,它是全局对象具有返回全局对象的引用的属性,因此即使不在全局范围内,也可以使用window
来引用它。)全局对象在浏览器上实际上非常拥挤,因为浏览器在其上为任何具有id
(属性名称为id
的元素转储属性,该值是对元素的引用),其中'某些浏览器上的forms
,all
,document
以及其他一些内容。
在浏览器之外,全局对象没有指向它的任何自动属性(好吧,除非环境添加一个),并且不会在其上有特定于浏览器的东西(但可能有东西)特定于你所处的环境。
*除非您的脚本顶部有"use strict"
,否则会将其置于严格模式,在这种情况下,this
为undefined
。
关于你从第一个例子中得到null
作为输出:我发现这非常令人惊讶;我本来期望""
(空白字符串),当然还有窗口的名称(如果有的话)。某个地方必须将null
或"null"
分配给name
(其中任何一个都会在我尝试过的各种浏览器上使用"null"
字符串[Chrome, Firefox,IE8,IE11])。您可以使用此页面进行尝试(jsFiddle等给窗口他们在名称中运行的东西,所以我不能在这个例子中使用它们):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
(function() {
"use strict";
display("[before] typeof name: " + typeof name);
display("[before] name: " + name);
display("Doing <code>name = null;</code>");
name = null; // Gets coerced to string "null"
display("[after] typeof name: " + typeof name);
display("[after] name: " + name);
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
</script>
</body>
</html>