JavaScript:undefined!== undefined?

时间:2009-04-22 12:23:14

标签: javascript

注意:根据ECMAScript5.1, section 15.1.1.3,window.undefined是只读的。

  • 现代浏览器正确实现了这一点。例如:Safari 5.1,Firefox 7,Chrome 20等
  • Undefined仍然可以改变:Chrome 14,...

当我最近将Facebook ConnectTersus集成时,我在尝试调用Facebook API函数时最初收到错误消息Invalid Enumeration ValueHandler already exists

事实证明问题的原因是

object.x === undefined

当'object'中没有属性'x'时返回false。

我通过在两个Facebook函数中用常规相等替换严格相等来解决这个问题:

FB.Sys.isUndefined = function(o) { return o == undefined;};
FB.Sys.containsKey = function(d, key) { return d[key] != undefined;};

这使得事情对我有用,但似乎暗示了Facebook的JavaScript代码和我自己的代码之间的某种冲突。

是什么导致这种情况?

提示:undefined == nullundefined !== null有详细记录。这不是问题。问题是我们如何得到undefined !== undefined

7 个答案:

答案 0 :(得分:89)

问题是与null相比,undefined使用==给出了true。 因此,对undefined的常见检查是这样完成的:

typeof x == "undefined"

这确保变量的类型确实是未定义的。

答案 1 :(得分:61)

事实证明,您可以将window.undefined设置为您想要的任何内容,因此当object.x是 real 未定义时,请获取object.x !== undefined。在我的情况下,我无意中将undefined设置为null。

最简单的方法是:

window.undefined = null;
alert(window.xyzw === undefined); // shows false

当然,这不太可能发生。在我的情况下,错误更加微妙,相当于以下场景。

var n = window.someName; // someName expected to be set but is actually undefined
window[n]=null; // I thought I was clearing the old value but was actually changing window.undefined to null
alert(window.xyzw === undefined); // shows false

答案 2 :(得分:19)

我想发布一些关于undefined的重要信息,初学者可能不知道这些信息。

请查看以下代码:

 /* 
  * Consider there is no code above. 
  * The browser runs these lines only.
  */

   // var a;  
   // --- commented out to point that we've forgotten to declare `a` variable 

   if ( a === undefined ) {
       alert('Not defined');
   } else {
       alert('Defined: ' + a);
   }

   alert('Doing important job below');

如果您运行此代码,其中变量a始终未使用var声明, 你会得到一个ERROR EXCEPTION,并且令人惊讶地看不到任何警报。

而不是“在下面执行重要工作”,您的脚本将意外终止,在第一行上抛出未处理的异常。


以下是使用undefined关键字检查typeof的唯一防弹方式,该关键字专为此目的而设计:

   /* 
    * Correct and safe way of checking for `undefined`: 
    */

   if ( typeof a === 'undefined' ) {
       alert(
           'The variable is not declared in this scope, \n' +
           'or you are pointing to unexisting property, \n' +
           'or no value has been set yet to the variable, \n' + 
           'or the value set was `undefined`. \n' +
           '(two last cases are equivalent, don\'t worry if it blows out your mind.'
           );
   }

   /* 
    *  Use `typeof` for checking things like that
    */

此方法适用于所有可能的情况。

使用它的最后一个参数是undefined可能在早期版本的Javascript中被覆盖:

     /* @ Trollface @ */
        undefined = 2;
     /* Happy debuging! */  

希望我足够清楚。

答案 3 :(得分:15)

使用==等于运算符而不是===是不好的做法。

undefined === undefined // true
null == undefined // true
null === undefined // false

object.x === undefined如果true是未知属性,则应返回x

在第Bad Parts of JavaScript: The Good Parts章中,Crockford写了以下内容:

  

如果您尝试从中提取值   一个对象,如果该对象没有   有一个有这个名字的成员,它   返回未定义的值。

     

除了undefined,JavaScript   有一个名为null的类似值。他们   是如此相似,==认为他们是   等于。这让一些程序员感到困惑   认为他们是   可互换,导致像

这样的代码
value = myObject[name];
if (value == null) {
    alert(name + ' not found.');
}
     

将错误的值与之比较   错误的操作员。这段代码有效   因为它包含两个错误   互相取消。那太疯狂了   编程方式。写得更好   像这样:

value = myObject[name];
if (value === undefined) {
    alert(name + ' not found.');
}

答案 4 :(得分:10)

从 - JQuery_Core_Style_Guidelines

  • 全局变量:
    typeof variable === "undefined"

  • 本地变量:
    variable === undefined

  • 属性:
    object.prop === undefined

答案 5 :(得分:4)

var a;

typeof a === 'undefined'; // true
a === undefined; // true
typeof a === typeof undefined; // true
typeof a === typeof sdfuwehflj; // true

答案 6 :(得分:2)

A)。我从来没有,也永远不会相信任何声称在没有用户编码的情况下生成代码的工具,在用作图形工具的情况下它会加倍。

B)。我对Facebook Connect一直没有任何问题。它仍然是在浏览器中运行的普通旧JavaScript代码,无论您身在何处都是undefined===undefined

简而言之,您需要提供证据证明您的object.x确实是未定义的,而不是null或其他,因为我相信您所描述的实际情况是不可能的 - 没有冒犯:) - 我把钱投入到Tersus代码中存在的问题上。