8

来自非 javascript 背景,我正试图将我的头绕在“未定义”周围。我写了一个“isUndefined”函数如下:

function isUndefined(value) {
    return (typeof value === 'undefined');
}

如果我在源代码中输入 this(其中不存在变量“boo”),我会得到预期的结果“未定义的变量”。

if (typeof boo === 'undefined') {
    console.log('undefined variable');
}

如果我输入以下内容: console.log (isUndefined(undefined));

我得到了预期的结果“真”

如果我输入: console.log(isUndefined(boo));

我得到:

参考错误:boo 未定义。

我希望得到“真” - 所以我的问题是为什么第一次“直接”检查未定义会返回预期结果,而函数()测试它却没有?

4

3 回答 3

7

恰好包含该值的现有变量undefined与根本不存在的变量之间存在差异。如果变量名不存在,则尝试引用它是错误的。

typeof运算符是一种特殊情况:即使没有该名称的变量,它也接受一个名称。但仅当名称实际运算符一起使用时typeof

在您的函数示例中,您使用了一个不存在的名称,并且在使用该名称的位置typeof没有运算符。那就是发生错误的地方。将名称传递给将使用的函数并不重要;该函数永远不会被调用,因为错误已经发生。typeof

如果您给它一个现有的变量名称,您的函数将按预期工作。然后它会告诉您该变量是否具有该undefined值:

var boo;  // now boo exists but has the undefined value
console.log( isUndefined(boo) );  // will log 'true'

window.boo如果您正在检查全局变量,那么如果您说而不是 just ,它将起作用boo。那是因为引用对象的不存在属性并不是错误。它只是undefined在您执行此操作时为您提供价值:

// logs 'true' if there is no global 'boo'
console.log( isUndefined(window.boo) );

但是,如果您想检查局部变量是否存在,那将行不通,因为它不是window对象的属性。

于 2013-06-23T22:03:04.207 回答
3

让我这样说:

var a = 5;
function foo(v){
    v += 5;
    console.log(v);
}

foo(a);
console.log(a);   // will give you 5, not 10

出于同样的原因 - 当你打电话时

isUndefined(boo)

boo不发送变量,发送 boo 的值。由于在调用期间未定义 boo,因此当您尝试达到它的值时会出现错误。

值得一提的是typeof不是一个函数,它是一个运算符

于 2013-06-23T21:58:32.480 回答
2

通常,Javascript 中尝试访问不存在的变量的行为是抛出 ReferenceError。typeof 运算符在这里是个例外,因为它经过特殊编码,如果您将不存在的变量传递给它,则不会给出这样的错误。

http://es5.github.io/#x11.4.3

11.4.3 typeof运算符#Ⓣ</p>

产生式 UnaryExpression : typeof UnaryExpression 的评估如下:

Let val be the result of evaluating UnaryExpression.

If Type(val) is Reference, then

    If IsUnresolvableReference(val) is true, return "undefined".

    Let val be GetValue(val).

为了避免 ReferenceError 你可以boo事先声明而不给它分配任何东西:

var boo;
console.log(isUndefined(boo));
console.log(typeof boo == 'undefined')
于 2013-06-23T22:11:02.133 回答