没有初始值的JavaScript变量在一种情况下返回null,在另一种情况下返回undefined

时间:2015-01-21 21:43:57

标签: javascript

所以我正在学习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.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Values,_variables,_and_literals#Declaring_variables

任何对官方文档的引用都会很棒!

1 个答案:

答案 0 :(得分:5)

如果您是在浏览器中执行此操作,那么因为浏览器环境中存在name (它是窗口的名称) )。所以var name是无操作的。但是见下文,null让我感到惊讶。

在JavaScript中,全局变量实际上是全局对象的属性。全局对象是全局范围*中代码中的值this。在浏览器中,全局对象是该页面的浏览器窗口对象,因此它具有为Window对象定义的任何属性。其中之一是name。 (另一个是window,它是全局对象具有返回全局对象的引用的属性,因此即使不在全局范围内,也可以使用window来引用它。)全局对象在浏览器上实际上非常拥挤,因为浏览器在其上为任何具有id(属性名称为id的元素转储属性,该值是对元素的引用),其中'某些浏览器上的formsalldocument以及其他一些内容。

在浏览器之外,全局对象没有指向它的任何自动属性(好吧,除非环境添加一个),并且不会在其上有特定于浏览器的东西(但可能有东西)特定于你所处的环境。


*除非您的脚本顶部有"use strict",否则会将其置于严格模式,在这种情况下,thisundefined


关于你从第一个例子中得到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>