无初始值的JavaScript变量在一种情况下返回null,在另一种情况下返回未定义
因此,我正在学习JavaScript并测试以下代码:无初始值的JavaScript变量在一种情况下返回null,在另一种情况下返回未定义,javascript,Javascript,因此,我正在学习JavaScript并测试以下代码: var name; console.log( name ); 返回null var c; console.log( c ); 返回未定义的 为什么会这样 文档状态:使用var语句声明的变量没有指定初始值,其值未定义。 任何对官方文件的引用都会很好 如果在浏览器中执行此操作,那是因为name已经存在于浏览器环境中(它是窗口的名称)。因此,var名称是一个不可操作的选项。但是如下所示,null位让我感到惊讶 在JavaScript中,全局
var name;
console.log( name );
返回null
var c;
console.log( c );
返回未定义的
为什么会这样
文档状态:使用var语句声明的变量没有指定初始值,其值未定义。
任何对官方文件的引用都会很好 如果在浏览器中执行此操作,那是因为
name
已经存在于浏览器环境中(它是窗口的名称)。因此,var名称
是一个不可操作的选项。但是如下所示,null
位让我感到惊讶
在JavaScript中,全局变量实际上是全局对象的属性。全局对象是该在全局范围内的代码中具有的值*。在浏览器中,全局对象是该页面的浏览器窗口对象,因此它具有为窗口对象定义的任何属性。其中之一是name
。(另一个是window
,这是全局对象的一个属性,它具有对全局对象的引用,因此您可以使用window
来引用它,即使不在全局范围内)。浏览器上的全局对象实际上相当拥挤,因为浏览器会为任何具有id
(属性名是id
,值是对元素的引用),在一些浏览器上有表单
,全部
,文档
,以及其他一些东西
在浏览器之外,全局对象没有任何指向它的自动属性(除非环境添加了自动属性),也没有特定于浏览器的内容(但可能有特定于您所在环境的内容)
*除非脚本顶部有
“use strict”
,这会将脚本置于严格模式,在这种情况下此
是未定义的
关于您从第一个示例中获得
null
作为输出:我发现这非常令人惊讶;我希望“”
(一个空白字符串)或者,当然,如果有窗口名称,则需要窗口名称。在某个地方,一定有什么东西将null
或指定给名称null
(在我尝试过的各种浏览器[Chrome、Firefox、IE8、IE11]上,这两种浏览器都是字符串“null”
)。您可以在这个页面上尝试(JSFIDLE等提供了窗口,它们以名称运行东西,所以我不能在这个示例中使用):
如果您在浏览器中执行此操作,这是因为name
已经存在于浏览器环境中(它是窗口的名称)。因此var name
是不可操作的。但是请参见下面的null
位让我感到惊讶
在JavaScript中,全局变量实际上是全局对象的属性。全局对象是这个
在全局范围内的代码中的值*。在浏览器中,全局对象是该页面的浏览器窗口对象,因此它具有为窗口对象定义的任何属性。其中之一是名称
。(另一个是window
,这是全局对象的一个属性,它具有对全局对象的引用,因此您可以使用window
来引用它,即使不在全局范围内)。浏览器上的全局对象实际上相当拥挤,因为浏览器会为任何具有id
(属性名是id
,值是对元素的引用),在一些浏览器上有表单
,全部
,文档
,以及其他一些东西
在浏览器之外,全局对象没有任何指向它的自动属性(除非环境添加了自动属性),也没有特定于浏览器的内容(但可能有特定于您所在环境的内容)
*除非脚本顶部有“use strict”
,这会将脚本置于严格模式,在这种情况下此
是未定义的
关于您从第一个示例中获得null
作为输出:我发现这非常令人惊讶;我希望“”
(一个空白字符串)或者,当然,如果有窗口名称,则需要窗口名称。在某个地方,一定有什么东西将null
或指定给名称null
(在我尝试过的各种浏览器[Chrome、Firefox、IE8、IE11]上,这两种浏览器都是字符串“null”
)。您可以在这个页面上尝试(JSFIDLE等提供了窗口,它们以名称运行东西,所以我不能在这个示例中使用):
两者都应该返回undefined
。试着发布一个演示来重现这个问题。啊,这是有道理的,我在Node中测试,在那里你会得到引用错误。两者都应该返回undefined
。试着发布一个演示来重现这个问题。啊,这是有道理的,我在Node中测试,在那里你会得到引用错误。谢谢!我在哪里可以测试JavaScript没有发生这些类型的事情吗?@samyismyhero:好吧,几乎任何环境都会有一些特定于环境的东西添加到全局对象中。例如,NodeJS添加了require
。但是我要说NodeJS将是一个比浏览器干净得多的环境;所有的东西都会被转储到全局对象中浏览器中的“no-op”是什么?谷歌说“no-operation”@samyismyhero:对。由于全局对象上已经有一个名为name
的属性,因此var name
没有任何作用。这是一个no-op。这是另一个JavaScript功能:声明一个已经存在的变量不会有任何作用(例如,不会导致错误)。这是一个模糊的描述,但如果你只是在学习,现在就足够了。谢谢!如果没有这些类型的事情发生,我在哪里可以测试纯JavaScript?@samyismyhero:嗯,几乎任何环境都会添加一些特定于环境的东西
<!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>