Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无初始值的JavaScript变量在一种情况下返回null,在另一种情况下返回未定义_Javascript - Fatal编程技术网

无初始值的JavaScript变量在一种情况下返回null,在另一种情况下返回未定义

无初始值的JavaScript变量在一种情况下返回null,在另一种情况下返回未定义,javascript,Javascript,因此,我正在学习JavaScript并测试以下代码: var name; console.log( name ); 返回null var c; console.log( c ); 返回未定义的 为什么会这样 文档状态:使用var语句声明的变量没有指定初始值,其值未定义。 任何对官方文件的引用都会很好 如果在浏览器中执行此操作,那是因为name已经存在于浏览器环境中(它是窗口的名称)。因此,var名称是一个不可操作的选项。但是如下所示,null位让我感到惊讶 在JavaScript中,全局

因此,我正在学习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>