理解JavaScript提升和真实性falsy

时间:2011-07-20 17:37:20

标签: javascript type-coercion truthiness hoisting

我一直在阅读有关JavaScript吊装的消息。

JavaScript Scoping and Hoisting by Ben Cherry
Two words about “hoisting” by Dmitry Soshnikov

并且,更多关于JavaScript类型强制,真相&假测试: Truth, Equality and JavaScript和其他一些资源

在练习一些时,发现我遗漏了一些关于吊装的重要概念和一个变量'truthy& falsy。

1:'如果'重复变量声明的真值测试

var foo = 1; 
function bar() { 
    if (!foo) { 
    alert('inside if');
        var foo = 10; 
    } 

} 
bar();

o / p:inside if

怀疑:'foo'值为'1',if(!foo)应评估为false且该块不应执行(引用上述资源:提升仅影响var& function声明,但不是执行)。但为什么会显示该警报。 如果我直接使用false(在下面的no-tricks代码中显示:代码段#3),则情况并非如此

2:'if'真实测试没有重复变量声明

var foo = 1; 
function bar() { 
    if (!foo) { 
        alert('inside if');
    } 

} 
bar();

o / p:没有输出;表示控制未输入'if'block
这是人们所期待的

3:'if'使用带有重复变量声明的'false'

var foo = 1; 
function bar() { 
    if (false) { 
        alert('inside if');
        var foo = 10; 
    } 
} 
bar();

o / p:没有输出;表示控制未输入'if'block
这是人们所期待的

有人请澄清。感谢

2 个答案:

答案 0 :(得分:8)

对于您的示例编号1,将显示警报,因为您在函数内部使用var并且var声明被提升到函数的顶部,因此它等效于:< / p>


var foo = 1; 
function bar() {
    var foo;
    if (!foo) {
        alert('inside if');
        foo = 10; 
    } 

} 
bar();

有人可能会得出结论,这些问题提供了令人信服的理由,可以在函数顶部明确声明所有变量。

答案 1 :(得分:1)

仅热切评估变量声明。第一种情况(在if块中)的变量赋值仅在进入if块时发生。

您仅声明但未指定任何值的变量的值为undefined(强制为false)。