Javascript 不应该';t未初始化的变量始终是未定义的类型

Javascript 不应该';t未初始化的变量始终是未定义的类型,javascript,node.js,initialization,standards,scope,Javascript,Node.js,Initialization,Standards,Scope,我遇到了一个案例,var的行为与直觉相反 以下是一个例子: for (var i = 0; i < 10; i++) { var toRun; if(i%2 !== 0) { toRun = {number:i}; } console.log("toRun is", toRun); if ('undefined' != typeof toRun && 'undefined' != typeof toRun.num

我遇到了一个案例,
var
的行为与直觉相反

以下是一个例子:

for (var i = 0; i < 10; i++) {
    var toRun;

    if(i%2 !== 0) {
        toRun = {number:i};
    }

    console.log("toRun is", toRun);

    if ('undefined' != typeof toRun && 'undefined' != typeof toRun.number)
    {
        //Do something
    }
}
我期待着:

toRun is undefined
toRun is { number: 1 }
toRun is undefined
toRun is { number: 3 }
toRun is undefined
toRun is { number: 5 }
toRun is undefined
toRun is { number: 7 }
toRun is undefined
toRun is { number: 9 }
这在javascript中是正常行为吗

每次执行循环中的代码时,toRun
var toRun
是否应该将
toRun
设置为
undefined

node -v
v0.10.33

是的,它们是javascript的正常行为。您告诉浏览器只有在未定义时才登录

而且你们确实在用正确的方法来检查“未定义”和typeof。typeof总是返回字符串。所以typeof是“未定义”的,在这种情况下,浏览器将不会记录


如果不检查就运行代码,那么只有您才能看到未定义的toRun的vlue。

只有函数才能在JavaScript中创建新的作用域。变量声明被提升到最内部函数的顶部

function one() {
  var a;
  console.log(a);
  a = 1;
}

function two() {
  console.log(a);
  var a = 1;
}

function three() {
  console.log(a);
  for(var i = 0;i < 10;i++) {
    var a;
  }
}
函数一(){
var a;
控制台日志(a);
a=1;
}
函数二(){
控制台日志(a);
var a=1;
}
职能三(){
控制台日志(a);
对于(变量i=0;i<10;i++){
var a;
}
}

这三个函数具有相同的行为-它们打印
未定义的
。请注意,声明已挂起,但初始化未挂起。

var
语句已挂起;作业不是。如果你写
var-toRun=undefined,你会得到你想要的,而不仅仅是
var-toRun@raina77ow:谢谢你为我指明了正确的方向。我不知道js会将变量的初始化移到当前函数的开头,我希望它在块级别这样做。你应该把这篇文章作为一个答案来回答这个问题。这个问题不是关于检查typeof,而是关于理解为什么每次执行代码时var没有初始化为undefined@raina77ow指出了正确的理由。
function one() {
  var a;
  console.log(a);
  a = 1;
}

function two() {
  console.log(a);
  var a = 1;
}

function three() {
  console.log(a);
  for(var i = 0;i < 10;i++) {
    var a;
  }
}