如何区分未声明的变量和声明但未赋值的变量?

时间:2011-12-30 03:18:13

标签: javascript

两种情况下,变量的类型都是"未定义"。 但未声明的变量会引发异常。

有没有一种简单的方法可以解决这个问题?

4 个答案:

答案 0 :(得分:4)

您可以在How to check if a variable or object is undefined?相关的问题中找到问题(和我的回答)。一般情况下,我查看任何对“未声明变量”的访问是一种编程错误。

但是,只能通过检测ReferenceError异常来检测此特殊情况。但是, yuck,yuck,yuck!记住变量声明是一个静态词法结构,忽略了全局对象的属性变量的怪癖。

ReferenceError,现在是“严格”,存在是有原因的,我怀疑这是一个X-Y问题。我甚至不建议为此目的使用typeof:修复代码: - )

快乐的编码。


*已经指出"variable" in window也将[并且]仅适用于全局“变量”(它们实际上只是不需要在所有上下文中限定的属性)。

答案 1 :(得分:1)

如果属性我们要检查对象是否存在,即使它是未定义的。

我们将使用以下其中一种: obj中的'prop'(检查原型链中的属性)或 obj.hasOwnProperty('prop')

我们需要使用上面的方法来检查属性是否存在,因为尚未在object中声明的访问属性也将返回undefined。

var o={};
o.c=undefined;
o.c===undefined; //is true
o.a===undefined; //is true as well even though c exists while a doesn't

通常不是问题,因为没有人真正声明未定义的属性,但是当这样做的时候这样做。

o.c=''; //when it can be string or 
o.c=null; //to clearly indicate that its nothing.
then
o.c === undefined will return false!
note!!!
null ==  undefined //true while
null === undefined //false that's why use three equals to test

对于未声明且不在对象内的变量。访问时编译器将返回(引用)错误。 如果不是,则意味着它被视为全局属性,窗口对象属性,并且未被声明,至少在所有父范围内,因此它将被定义为o.a在顶部。它将变为window.prop

so x; //error
but x=3; //no error assumed to be global object.
just like o.abcd = 3; would...
make(declare) a property abcd in object o valued(assigned) 3 all at once.

为避免属性成为全局变量,我们在函数中使用 var关键字,如var k;

你可以做的一件事就是在抛出一个不存在的变量并且被认为是变量本身时捕获引用错误。

try {
x
} catch(e){//code to run when x is not declared let alone defined.}

答案 2 :(得分:0)

您可以try

var a;
try {
    a;
    alert('a');
} catch(e) { /* a not defined */ }
try {
    b;
    alert('b');
} catch(e) { /* b not defined */ }
alert('done');

DEMO

答案 3 :(得分:0)

如果您正在编写干净的JS,那么您永远不应该尝试访问未声明的变量。为了避免这些陷阱(以及许多其他陷阱),请开始使用http://www.jslint.com/http://jshint.com/来推送您的JS。

帮助您理解LINT工具及其发现背后的推理的好读物是Crockford的书,JavaScript:好的部分(http://www.amazon.com/gp/aw/d/0596517742)。