JavaScript:undefined!== undefined?

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

  • 现代浏览器正确实现了这一点。 例如:Safari 5.1,Firefox 7,Chrome 20等。
  • 未定义的仍然可以更改:Chrome 14,...
  • 当我最近将Facebook Connect与Tersus集成时,我最初收到错误消息Invalid Enumeration ValueHandler already exists在尝试调用Facebook API函数时Handler already exists

    原来,问题的原因是

    object.x === undefined
    

    “对象”中没有属性“x”时返回false。

    我通过用两个Facebook功能中的常规平等来代替严格的平等来解决这个问题:

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

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

    什么会造成这种情况?

    提示:有很多文档记录undefined == nullundefined !== null 。 这不是问题。 问题是我们如何得到undefined !== undefined


    问题在于,与使用==的null相比,未定义赋予true。 因此,未定义的常见检查就是这样完成的:

    typeof x == "undefined"
    

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


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

    最容易看到这种情况的方法是:

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

    当然,这不太可能发生。 在我的情况下,这个bug比较微妙,并且等同于以下情况。

    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
    

    我想发布一些关于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 ,你会得到一个错误异常,并且令人惊讶地看不到任何警报。

    而不是'做重要工作',脚本将终止意外,在第一行抛出未处理的异常。


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

       /* 
        * 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
        */
    

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

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

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

    希望我很清楚。

    链接地址: http://www.djcxy.com/p/19421.html

    上一篇: JavaScript: undefined !== undefined?

    下一篇: When would JavaScript == make more sense than ===?