来自非JavaScript的背景,我试图围绕'未定义'。 我写了一个“isUndefined”函数如下:
function isUndefined(value) {
return (typeof value === 'undefined');
}
如果我输入我的源码(变量'boo'不存在),我得到预期结果“未定义变量”。
if (typeof boo === 'undefined') {
console.log('undefined variable');
}
如果我键入以下内容:
console.log (isUndefined(undefined));
我得到了预期的结果'true'
如果我输入:console.log(isUndefined(boo));
我明白了:
参考错误:未定义boo。
我希望得到'true' - 所以我的问题是为什么对undefined的第一次“直接”检查会返回预期结果,但是对它进行函数()测试却没有?
答案 0 :(得分: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
而不仅仅是boo
,那么它将起作用。那是因为引用一个不存在的对象属性并不是一个错误;它只会在您执行此操作时为您提供undefined
值:
// logs 'true' if there is no global 'boo'
console.log( isUndefined(window.boo) );
如果您想检查 local 变量是否存在,那将无效,因为它不是window
对象的属性。
答案 1 :(得分: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不是一个函数,它是一个运算符
答案 2 :(得分:2)
通常,Javascript中用于尝试访问不存在的变量的行为是抛出ReferenceError。 typeof运算符在这里是例外,因为如果你传递一个不存在的变量,它的特殊编码不会产生这样的错误。
11.4.3运营商#Ⓣ
的类型评估生产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')